一、今日刷题
1. 第二部分:字符串 -- 389.找不同 二、知识积累:
1. ASCII码:
一、今日刷题 1. 第二部分:字符串 – 389.找不同
跳转LeetCode
给定两个字符串 s 和 t ,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例 1:
输入:s = “abcd”, t = “abcde”
输出:“e”
解释:‘e’ 是那个被添加的字母。
示例 2:
输入:s = “”, t = “y”
输出:“y”
答案代码:
错误代码:无法解决a + aa这种情况(修改方法写在注释里了,其实最后的return语句写的也不好,学习题解是怎么写的)
package String; import java.util.HashMap; import java.util.Map; public class FindTheDifference { public static void main(String[] args) { FindTheDifference findTheDifference = new FindTheDifference(); char ans = findTheDifference.findTheDifference("ascd", "safcd"); System.out.println(ans); } public char findTheDifference(String s, String t) { Mapans = new HashMap<>(); char result = ' '; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); int frequency = ans.getOrDefault(c, 0); ans.put(c, frequency + 1); } for (int j = 0; j < t.length(); j++) { char c = t.charAt(j); int frequency = ans.getOrDefault(c, 0); ans.put(c, frequency + 1); //ans.put(c, frequency - 1); } for (int m = 0; m < t.length(); m++) { if (ans.get(t.charAt(m)) == 1) { //if (ans.get(t.charAt(m)) < 0) result = t.charAt(m); } } return result; } }
题解方法①:
首先遍历字符串 s,对其中的每个字符都将计数值加 1;然后遍历字符串 t,对其中的每个字符都将计数值减 1。当发现某个字符计数值为负数时,说明该字符在字符串 t 中出现的次数大于在字符串 s 中出现的次数,因此该字符为被添加的字符。
(其实我用哈希表就是这种思想)
class Solution { public char findTheDifference(String s, String t) { int[] cnt = new int[26]; for (int i = 0; i < s.length(); ++i) { char ch = s.charAt(i); cnt[ch - 'a']++; } for (int i = 0; i < t.length(); ++i) { char ch = t.charAt(i); cnt[ch - 'a']--; if (cnt[ch - 'a'] < 0) { return ch; } } return ' '; //学习这个return的全过程 } }
题解方法②:
将字符串 s 中每个字符的 ASCII 码的值求和,得到 A_s;对字符串 t 同样的方法得到 A_t 。两者的差值 A_t - A_s 即代表了被添加的字符。
(体会ASCII码是怎么计算的!)
class Solution { public char findTheDifference(String s, String t) { int as = 0, at = 0; for (int i = 0; i < s.length(); ++i) { as += s.charAt(i); } for (int i = 0; i < t.length(); ++i) { at += t.charAt(i); } return (char) (at - as); } }二、知识积累: 1. ASCII码:
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。
ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)