异或应用小总结

来源:互联网 发布:淘宝免费开店步骤 编辑:程序博客网 时间:2024/05/18 01:01

这里只总结我做过的几道异或的题,所以肯定不全面,日后再添加啦。


1.交换

交换a和b的简单写法

a ^= b;b ^= a;a ^= b; 
2.一个整形数组,存1到n的所有整数,但缺省一个值,找出此值。

先求1到n的异或,再和数组中所有数异或,结果就是要找的值。

3.一个整形数组除一个数只出现一次外,其余的都出现2次,求这个数
数组中所有值进行异或即可。
4.一个整形数组除两个数只出现一次外,其余的都出现2次,求这两个数。
若求所有数的异或,得出的是那两个数的异或值,这样没法分出两数。
有两种方法:(1)不同的两个数进行异或,肯定有至少1位为1。比如,这两个数的二进制为1101和0001,异或结果为1100。那么找出这个1,就可以把整个数组分为两部分,再利用2中的方法一一找出。
<pre name="code" class="java">public static void findTwoNumber(int[] a) {    int sum = 0;    for (int i = 0; i < a.length; i++) {    sum = sum ^ a[i]; }   int bit = 1; // 从最低位,即0001开始找while (true) {  if ((sum & bit) != 0)           {               break;  // 通过与bit相与,找出异或后为1的那一位         }           else           {               bit = (bit<<1);           }       }int re1 = 0; int re2 = 0;for (int i = 0; i < a.length; i++) { if ((bit & a[i]) != 0) { // 利用与bit相与是否为0将数组分成两部分 re1 ^= a[i]; } else { re2 ^= a[i]; } }System.out.println(re1 + " " + re2); }
(2)将所有数异或,得出的值为a^b,再一一和数组中的值进行异或,得出的每个值存入一个list,由于两个数之外的值出现两次,判断数组中若已存在此值,将其删掉,最后list中就只有两个值,即为a与b
public static void findTwoNumber(int[] a) {    int sum = 0;    for (int i = 0; i < a.length; i++) {    sum = sum ^ a[i];    }    List<Integer> list = new ArrayList<Integer>();    for (int i = 0; i < a.length; i++) {    int u = sum ^ a[i];    if (list.contains(u)) {    list.remove(Integer.valueOf(u));    } else {    list.add(u);    }    }    System.out.println((list.get(0)) + " " + (list.get(1))); }
5.一个整形数组除3个数只出现一次外,其余的都出现2次,求这3个数。
将所有数异或,得出的值sum为a^b^c,再一一和数组中的值进行异或,得出的每个值存入一个list。将出现两次的值删掉,最后list中就只有三个值:a^b,a^c,b^c,三值与sum异或,即得c,b,a三个数。同理可求4个或更多出现一次的数。
public static void findThreeNumber(int[] a) {    int sum = 0;    for (int i = 0; i < a.length; i++) {    sum = sum ^ a[i];    }    List<Integer> list = new ArrayList<Integer>();        for (int i = 0; i < a.length; i++) {    int u = sum ^ a[i];    if (list.contains(u)) {    list.remove(Integer.valueOf(u));    } else {    list.add(u);    }    }    System.out.println((sum ^ list.get(0)) + " " + (sum ^ list.get(1)) + " " + (sum ^ list.get(2)));   }
6.Leetcode389.Find the Difference
String s 和 String t仅含小写字母字符,其中t是s的重排且加了一个字符,找到那个新加入的字符。题意示例:
Input:s = "abcd"t = "abcde"Output:e
对s和t的每个字符异或。
public static char findTheDifference(String s, String t) {char a = 0;for (int i = 0; i < s.length(); i++) {a ^= s.charAt(i); // 异或}for (int i = 0; i < t.length(); i++) {a ^= t.charAt(i);}return a;}





0 0