算法:数组找出2个只出现一次的数字(其他元素出现两次)
来源:互联网 发布:js点击弹出对话框 编辑:程序博客网 时间:2024/05/21 10:09
思路:
1、依然从头到尾异或所有的数字,这样得到的结果实际上就是两个只出现了一次的数字异或的结果,
2、在异或后的结果中找出其二进制中最右边为1的位,该位既然为1,说明异或的两个数字对应的该位肯定不同,必定一个为1,一个为0
3、根据此位是否为1来划分这两个部分,返回为true的元素异或得到一个数字为num1,返回false的所有元素异或的到num2
/** * Created by Administrator on 2016/7/4. * 数组2个只出现一次的数字,其他都是出现2次 * 分析: * 假设这个2个数为a,b,一个数异或它自己得0 a^a=0 故 把所有的元素异或异常得到的结果是a^b */public class FindUniqueValueDemo { private static int sum; private static int num1; private static int num2; public static void main(String args[]) { int[] arr = {3, 5, 6, 3, 2, 5, 7, 7, 11, 9, 6, 8, 9, 8}; findUnique(arr); System.out.println(sum); System.out.println(num1 + ":" + num2); } private static void findUnique(int[] arr) { final int end = arr.length; if (end < 2) { return; } for (int i = 0; i < end; i++) { sum = sum ^ arr[i]; } int flag = lastValue1(sum); for (int j = 0; j < end; j++) { if (IsBit1(arr[j], flag)) num1 ^= arr[j]; else num2 ^= arr[j]; } } private static int lastValue1(int num) { //得到该num的最好一个1 return num & ~(num - 1); } /** * 判断data中特定的位是否为1, * .这里的要判断的特定的位由res确定, * .flag中只有一位为1,其他位均为0,由lastValue1函数返回, * .而data中要判断的位便是flag中这唯一的1所在的位 * * @param data * @param flag * @return */ static boolean IsBit1(int data, int flag) { return ((data & flag) == 0) ? false : true; }}
0 0
- 算法:数组找出2个只出现一次的数字(其他元素出现两次)
- 算法习题61:找出数组中两个只出现一次的数字:一个整型数组里除了两个数字之外,其他的数字都出现了两次
- 找出数组中2个只出现一次的数字
- 找出数组中只出现一次的2个数字
- 找出数组中只出现一次/两次/三次的数字,而其他数字都出现偶数次
- 一个数组有除了两个元素只出现一次,其他元素全部都出现了两次,请找出只出现一次的两个元素,并输出
- 一个数组中有三个数字a、b、c只出现一次,其他数字都出现了两次。请找出三个只出现一次的数字。
- 经典算法题1:找出数组中只出现一次的数字,其它数字都出现了两次
- 经典算法题1:找出数组中只出现一次的数字,其它数字都出现了两次
- 找出数组中只出现一次的数字,其它数字都出现了两次,及其扩展
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。 请写程序找出这两个只出现一次的数字。
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写程序找出这两个只出现一次的数字
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 数据库中where 1=1 的用法
- dmidecode
- 算子(operator)的学习(一)
- WebRTC手记Channel概念
- Jmeter(8)---- java sample请求
- 算法:数组找出2个只出现一次的数字(其他元素出现两次)
- HttpURLConnection 发送(POST)数据到服务器
- MySql主从架构之-概述
- 链表排序
- Matlab绘制三维线性图形
- adb 安装 apk bat脚本,支持多设备
- 最长递增子序列B(完美2017实习生)
- 关于vs2015生成软件在不同机器上运行缺少库(dll)
- mysql主从复制(mysql 5.1.73)