问题:
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.
字符串s和t由小写字母组成,其中t是通过将s中的字母顺序打乱并在一个随机位置插入某个字母生成的,在找出t中插入的字母。
解:
1、这个字母可能是s中已有的或者是新的字母但是其实这个并不重要,判断某个字母是否是插入的字母(我们这边称之为c)得看这个字母是否同时在s和t中出现,如果只在t中出现则说明该字母为所求,所以统计s和t中所有的字母出现次数,出现次数为奇数的字母即为所求。
var findTheDifference = function(s, t) { var arr={}; for(var i=0;i<t.length;i++){ if(i<s.length){ var schar = s.charAt(i); arr[schar] = arr.hasOwnProperty(schar) ? arr[schar]+1 : 1; } var tchar = t.charAt(i); arr[tchar] = arr.hasOwnProperty(tchar) ? arr[tchar]+1 : 1; } var rt=""; for(var key in arr){ if(arr[key]%2==1){ rt = key; break; } } return rt; };
2、上面的方法能解决问题,但并非最优解(毕竟做了2次遍历)。我们想到,因为只有一个字母是无法和另外的字母配对的,其他字母都可以是一一地应的,所以是否可以将一一对应的字母做运算得出一个空,将所有字母做如此运算就将得到我们想要的字母c,比如 f(A,A)="",f(A,"")=A。我们想到了异或运算。将字母转成相应的Unicode编码,然后进行异或。
var findTheDifference = function(s, t) { var c = t.charCodeAt(t.length-1); for(var i=0;i<s.length;i++){ c ^= s.charCodeAt(i); c ^= t.charCodeAt(i); } return String.fromCharCode(c); };
所以要在一群情侣中找那个单身狗最好的方法就是使用异或运算
浙公网安备 33010602011771号