389. Find the Difference
1 题目
Given two strings s and t which consist of only lowercase letters.
String t is generated by random shuffling string s and then add one more letter at a random position.
Find the letter that was added in t.
Example:
Input:
s = "abcd"
t = "abcde"
Output:
e
Explanation:
'e' is the letter that was added.
2 翻译
给定两个字符串s和t,它们只包含小写字母。
字符串t由随机混洗字符串s生成,然后在随机位置添加一个字母。
找到在t中添加的字母。
例:
输入:
s =“abcd”
t =“abcde”
输出:
Ë
说明:
'e'是添加的字母。
3 解题思路
我看标签里有写hashtable和bit,所以我就把二者结合起来使用了,效率还可以,击败了56%左右的人
public class Solution {
public char findTheDifference(String s, String t) {
int [] hashtable=new int[26];
char [] chars = s.toCharArray();
char [] chart = t.toCharArray();
char result = 0;
for(int i=0;i<chars.length;i++){
hashtable[chars[i]-'a'] ^= chars[i];
}
for(int i=0;i<chart.length;i++){
hashtable[chart[i]-'a'] ^= chart[i];
}
for(int i=0;i<hashtable.length;i++){
if(hashtable[i]!=0){
result = (char) (i+'a');
break;
}
}
return result;
}
}
最简洁和快速的莫过于只使用位运算了,位运算的原理如下:
最开始result值是0,比如说第一步c=’a’,’a’的ASCII码是01100001,
result=result^c相当于r= 00000000 ^01100001
r = 01100001
第二步c再次=’a’的时候,r=’a’^’a’
r= 01100001 ^ 01100001 =00000000
就可以看出来,异或运算有两个性质:
0^x =x
x^x =0
所以比如说 ‘a ‘^ ‘a’ ^ ‘b’ ^ ‘b’ ^ ‘c’ =’c’
异或运算还满足交换律
所以上面的顺序换了也是对的
所以异或了一遍剩下的结果就是要的那个字符
代码如下
public class Solution {
public char findTheDifference(String s, String t) {
char result = 0;
for(char c : s.toCharArray()) result ^= c;
for(char c : t.toCharArray()) result ^= c;
return result;
}
}
欢迎加入中科院开源软件自习室:631696396