找不同
找不同
问题描述:
给定两个字符串s和t;它们只包含小写字母。
字符串t由字符串s重排,然后在随机位置添加一个字母。
请找出t中被添加的字母。
示例1:
输入:s = “abcd” t = “abcde”
输出:“e”
示例2
输入:s = “ ” t = “y”
输出:“y”
提示:
0 <=s.length <= 1000
t.length == s.length + 1
s和t只包含小写字母
方法一:异或位运算(最优解)
解题思路
-
t比s多了一个字母,那就是只有一个字母出现了一次,找出这个只出现一次的字母即可
-
同一个数做两次异或的结果为0,所以将s和t连接成一个字符串,然后进行性异或运算,所有出现两次的就会被消去。
-
异或运算的性质
-
a ^ a = 0; 任何数与自己异或结果是0
-
a ^ 0 = a; 任何数与0异或结果是自身
-
a ^ b ^ c = b ^ a ^ c; 异或运算满足交换律和结合律
Java
public class findDifference { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String s = scanner.nextLine(); String t = scanner.nextLine(); int ret = 0; for (int i = 0; i < s.length(); i++) { ret ^= s.charAt(i); } for(int i = 0;i < t.length();i++){ ret ^= t.charAt(i); } System.out.println((char)(ret)); scanner.close(); } }
C++
#include<iostream> #include<string> #include<set> #include <vector> using namespace std; int main() { string s; string t; int ret = 0; cin>>s; cin>>t; for(char ch :s) { ret ^= ch; } for(char ch :t) { ret ^= ch; } cout<<(char)ret<<endl; return 0; }
方法二:求和相减
- 对s字符串求它的ASCII码值ss,对t求它的ASCII码值tt,两者的差即被添加字母的十进制ASCII码值
Java
public class findDifference1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
String t = scanner.nextLine();
int ss = 0;
int tt = 0;
for (int i = 0;i < s.length();i++){
ss += s.charAt(i);
}
for (int i = 0;i < t.length();i++){
tt += s.charAt(i);
}
System.out.println((char)(tt - ss));
scanner.close();
}
}