離家不遠

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

问题:

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);
};

 所以要在一群情侣中找那个单身狗最好的方法就是使用异或运算

posted on 2020-09-25 14:24  離家不遠  阅读(184)  评论(0)    收藏  举报