异或应用小总结
来源:互联网 发布:淘宝免费开店步骤 编辑:程序博客网 时间: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
- 异或应用小总结
- 异或 算法 小总结
- 异或与Tire 树 小总结
- 2017.10.12 小Q的无敌异或 失败总结
- PHP应用技巧小总结
- Java应用小实例总结
- 异或运算应用
- 异或运算应用
- 异或的应用
- 异或应用
- 异或操作总结
- 做完一个小应用之后的总结
- 正则表达式的应用小总结
- Yii framework 应用总结小窍门
- Yii framework 应用总结小窍门
- .net中tcp应用编程小总结
- Android 应用开发使用小技巧总结
- android powerkey触发小应用总结
- spring的管理bean和依赖注入的原理剖析
- 计算机视觉和图像处理框架
- fragment中判断网络
- hdu1010Tempter of the Bone 搜索
- web前端总结一DOM性能优化
- 异或应用小总结
- iOS --判断设备是否为越狱设备,防止越狱设备进行iap内购
- java设计模式进阶_property
- Flume官方文档翻译之(三)
- 【用Cocos Creator给暗恋的女生写一个游戏(11)】——(Jump Game) 镜头跟随
- 【如何快速的开发一个简单的iOS直播app】(代码篇)
- 关于移动视频直播技术,关键干货都在这里了(三)编码和封装
- 异常体系
- 给Raspbian加上炫酷的SSH欢迎信息