^异或运算。求解成对出现的一个未成对的数。
来源:互联网 发布:网络对青少年的好处 编辑:程序博客网 时间:2024/04/30 14:07
求解成对出现的一个未成对的数
例如:[1,1,2,2,3,3,4],怎么快速查找出4这个值?
第一个思路就是放在map里,key为数值,value为出现次数。最
后再循环查找value为1的key值。
Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for(int i = 0; i < array.length; i++){ if(!map.containsKey(array[i])){ map.put(array[i], 1); }else{ Integer num = map.get(array[i]); map.put(array[i], ++num); } } for(Map.Entry<Integer, Integer> m : map.entrySet()){ if(m.getValue() == 1){ System.out.println(m.getKey()); break; } }
这样虽然可以得到答案,但却不是最优解,出题人用了异或^符号。
int num = array[0]; for (int i = 1; i < array.length; i++) { num = num ^ array[i]; } System.out.println(num);
为什么把所有的数异或可以得到未成对数呢?
异或^ : 比较数的二进制各个位,值相同为0, 不同为1.
01
^ = 00
0100
^ = 01
01
结论:
1,任意数异或本身结果为0。( x ^ x = 0 )
2,任意数异或0结果为本身。( x ^ 0 = x )
结果和减法一样。^_^
// 使用异或^进行两个数的交换。 a = a ^ b; b = b ^ a; // b ^ a ^ b = a a = a ^ b; // a ^ b ^ b = a ^ b ^ a = b
0 0
- ^异或运算。求解成对出现的一个未成对的数。
- 找出数组中非成对出现的数
- 笔试面试成对出现的一组数,只有一个或两个只出现一次的数字,找到它们。
- 【C语言】在两个数成对出现的数组中找到一个单独的数。
- 关于按位异或用于抵消成对出现的数据
- 将一个罗马数转化成对应的阿拉伯数
- 找出一个数组中唯一没有成对出现的两个数
- 其他数字都是成对出现,找出唯一单独出现的数字------强大的异或
- 一个数组,其中除两个数外,其余的数全是成对出现的,用时间复杂度O(n),空间复杂度O(1)求解不成堆出现的两个数
- 一个数组中只有两个数字单独出现,其余数字都是成对出现的,请找出这两个数。
- 找出一组数中只出现一次的两个数,其他所有数都是成对出现的
- pthread_cleanup_push/pop成对出现的意义
- pthread_cleanup_push/pop成对出现的意义
- 构造方法 //将文件封装成对象,可以将已有的和未出现的文件或文件夹封装成对象。 File f = new File(“文件夹及文件路径”); // File f = new File(“文件目录”
- 【c语言】给一组数,只有一个数只出现了一次,其他所有数都是成对出现的。找出这个数
- 奇数个元素,数组元素成对出现,找出只出现一次的数
- 一个数组中所有的数都是成对出现的只有一个或者两个数字是单独的,求这个数
- 成对的字符串
- jvm加载过程分析
- matlab simulink S-Function m文件的写法
- Ubuntu12.04安装sun-java6-jdk
- Spring回顾学习
- 简单扫雷游戏的实现
- ^异或运算。求解成对出现的一个未成对的数。
- 获取ListView滚动精确值
- QNX下ssh服务安装指南
- 前端动效--页面滑动
- Pixhawk——框架学习
- Android之shape设置虚线无效果
- 输入输出数据与MWNumericArray
- MySQL 百万级分页优化(Mysql千万级快速分页)
- 访问者模式——对象行为型模式