leetcode-389. Find the Difference
389. Find the Differenc
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.
这里用到了异或运算,关于XOR的运算应该还是简单的,就是这次的是字符,先转换为2进制再异或就好了。
可以看一下这个例子:
str[low] ^= str[i]; str[i] ^= str[low]; str[low] ^= str[i];就相当于:
char temp = str[low]; str[low] = str[i]; str[i] = temp;
假设某个循环时 str[low] = 'a', str[i] = 'b', ‘a’的整数形式是97,二进制形式是01100001,‘b’的整数形式是98,二进制形式是01100010.
1 执行str[low] ^= str[i]; 相当于 str[low] = str[low] ^str[i] ,即 str[low] = 01100001 ^ 01100010 = 00000011. 这是个临时值。
2 执行str[i] ^= str[low]; 相当于 str[i] = str[i] ^ str[low], 即 str[i] = 01100010 ^ 00000011 = 01100001. 这句相当于把'a' 赋值给了str[i].
3 执行 str[low] ^= str[i]; 相当于 str[low] = str[low] ^ str[i] 即 str[low] = 00000011 ^ 01100001 = 01100010, 这句就是把 'b' 赋值给了str[low] .
就完成了字符交换。
再看代码就容易理解了:(solution)
public char findTheDifference(String s, String t) { char c = 0; for (int i = 0; i < s.length(); ++i) { c ^= s.charAt(i); } for (int i = 0; i < t.length(); ++i) { c ^= t.charAt(i); } return c; }优化后:( 题目中指出 t 字符串长于 s 字符串 )
public char findTheDifference(String s, String t) { int n = t.length(); char c = t.charAt(n - 1); for (int i = 0; i < n - 1; ++i) { c ^= s.charAt(i); c ^= t.charAt(i); } return c; }