落单的数
2015-11-12 20:13
387 查看
落单的数一
给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字。解题思路:
通过相同的数异或为0 , 与0异或保留, 并且异或的结果与顺序无关代码实现
/** *函数功能:找出2n+1个数中的落单的数 *函数描述:通过相互异或来确定落单的数 */ public static Integer singleNum(int[] arr, int len){ //注意逻辑问题 if(len == 0) return null; int ret = arr[0]; for (int i = 1; i < len; i++){ ret ^= arr[i]; } return ret; }
落单的数二
给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字。解题思路
用Map来存储key-value , 其中key为数组中的数据, value为其出现的次数,如果出现次数为3次,就可以把它给删除,最后剩下的就是落单的数。代码实现
public int singleNumberII(int[] A) { // write your code here if(A.length == 0){ return 0; } HashMap<Integer, Integer> map = new HashMap<>(); for(int i = 0; i < A.length; i++){ if(map.containsKey(A[i])){ map.put(A[i], map.get(A[i]) + 1); }else { map.put(A[i], 1); } if(map.get(A[i]) == 3){ map.remove(A[i]); } } Set<Integer> result = map.keySet(); int single = 0; for(Integer temp : result){ single = temp; } return single; }
落单的数三
给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字。解题思路
如果两个不同的数是a和b,先将这个数相互异或得到c, c不等于0, 找出c的二进制位中为1的位,可推断a和b的这位分别为0和1, 然后将2n+2个数,按这位为0或1分成两组,这两组(2k + 1, 2j + 1)分别单独异或, 得到结果代码实现
public static int[] twoSingleNum(int[] arr){ Integer tempResult = singleNum(arr, arr.length); if(tempResult != null) { int c = tempResult; int d = 1; int count = 1; while ((c & d) == 0) { count++; d <<= 1; } int ret1 = 0; int ret2 = 0; for (int num : arr) { if (bitOne(num, count - 1)) ret1 ^= num; else ret2 ^= num; } return new int[]{ret1, ret2}; } return null; }
相关文章推荐
- linux 对于文件的处理
- Ubuntu下安装使用MongoDB
- URAL 1132 二次剩余
- 黑马程序员——正则表达式
- C语言格式化输入输出
- Locale(编码问题)
- 关于input的file框onchange事件触发一次失效的新的解决方法
- 字符串指定位置插入
- PostgreSQL安装的问题
- Git的认知及基础操作
- 2015-2016 ACM-ICPC, NEERC, Moscow Subregional Contest K. King’s Rout(拓扑排序)
- MarkDown页内跳转实现
- HDU-5532(LIS-nlogn)
- Android Studio开发环境搭建准备
- AsyncTask和Handler对比
- web前端 常用meta标签
- C# 多线程学习系列三:线程优先级、线程同步以及向线程传递参数
- Android 应用签名
- poj 2531 Network Saboteur(经典dfs)
- java jni 入门7 - 访问数组元素