一、今日刷题
1. 第二部分:字符串 – 389.找不同
给定两个字符串 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;
/**
* @author: LYZ
* @date: 2022/1/30 19:25
* @description: 389.给定两个字符串 s 和 t ,它们只包含小写字母。
* 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
* 请找出在 t 中被添加的字母。
*/
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) {
Map<Character, Integer> ans = 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 种可能的字符。