怎样用异或查找出多出的字母

来源:互联网 发布:金知云林秀晶 编辑:程序博客网 时间:2024/06/04 21:21

  今天刷leetcode,遇到了一道题,很有意思,就是给了俩字符串,一个A,一个B,字符串B是这样子的,先把字符串A打乱,然后随机在A中加入一个任意字母,就变成了B。问加入的是啥字母?
  举个例子:
  A:“abc”
  B:“cbea”
  那么很明显,加入的字母是e。如何求出来呢?
  这里介绍一种非常简单的方法,就是使用异或。
  因为字母是char类型,char类型可以当做int来看待,所以,char类型也是可以进行异或操作的。
  众所周知。异或有两个性质:
  第一个性质是:0异或任何数会得到这个数
  比如0^2:
  0000
  0010
  ——
  0010
  还是会得到2。
  
  第二个性质是:一个数异或上它自己等于0
  也很好理解吧?比如2^2
  0010
  0010
  ——
  0000

  那么第二个性质,我们可以得出:
  a^a^b^b^c^c…=0
  
  现在看这道题,我们现在想要找出B字符串中多出来的那个字母是啥。
  我们可以将A中所有的字母全部异或,得到
  a^b^c
  我们将得到的结果再与B中所有的字母相异或,得到:
  a^b^c^c^b^e^a
  整理一下就是:
  a^a^b^b^c^c^e
  最后得到的当然就是e咯。
  最后上程序,在程序里我们用r作为最终结果,让r = 0,然后让r去分别异或A中的所有字母和B中的所有字母,因为0异或任何数都得原数,所以给r赋初始值为0。
  

public class Solution {    public char findTheDifference(String s, String t) {        char r = 0;        for(int i = 0;i<s.length();i++)            r^=s.charAt(i);        for(int i = 0;i<t.length();i++)            r^=t.charAt(i);        return r;    }}

  特此记录,谨防忘记!

原创粉丝点击