leetcode_137 Single Number II
来源:互联网 发布:买烟用什么软件 编辑:程序博客网 时间:2024/06/05 03:00
题目分析:
给定一个数组,里面只有一个数只出现一次,其他的数均出现三次,请找出这个只出现一次的数。
解题思路:
方法1 利用map实现
1)遍历整个数组,统计数组中每个数出现的次数,并将其保存在map种
2)遍历数组中元素,查看map中对应元素出现的次数,如果出现只出现一次,则返回次元素,并结束程序即可。
方法2 统计数组数的各个位之和
1)int类型是32位数,对数组中所有数(32位int类)的各个位进行求和
2)将就和的结果进行模3操作,放在结果的对应位置上即可。
方法3 统计出现1次,2次,3次的数
整体思想:利用3个变量分别保存各个二进制位上1出现一次、两次、三次的分布情况,最后只需要返回变量1就可以了。
1)每次循环先计算twos,即出现两次的1的分布;
2)然后计算出现一次的1的分布;
3)接着二者进行与操作,得到三次出现1的分布;
4)然后多three取反,在与ones、twos进行与操作,目的是将出现三次的位置清零。
实现程序
C++版本
// 方法1实现int singleNumber(vector<int> nums){ map<int, int> mp; for (int i = 0; i < nums.size(); i++) { mp[nums[i]]++; } for (int i = 0; i < nums.size(); i++) { if (mp[nums[i]] == 1) return nums[i]; } return 0;}//方法2实现 int singleNumber1(vector<int> &nums){ int bitnum[32] = {0}; int result = 0; for (int i = 0; i < 32; i++) { // 统计所有数对应第i位数的所有和 for (int j = 0; j < nums.size(); j++) { bitnum[i] += (nums[j] >> i) & 1; } // 获取最后结果中第i位数对应的值 result |= (bitnum[i] % 3) << i; } return result;}//方法3实现int singleNumber1(vector<int> nums){ int one = 0; int two = 0; int three = 0; for (int i = 0; i < nums.size(); i++) { two |= one & nums[i]; one ^= nums[i]; three = one & two; one &= ~three; two &= ~three; } return one;}
Java版本
// 方法1实现public int singleNumber1(int[] nums){ Map<Integer, Integer> mp = new HashMap<Integer, Integer>(); // 统计每个数出现的次数 for (int i = 0; i < nums.length; i++){ if (mp.containsKey(nums[i])){ int count = mp.get(nums[i]); mp.put(nums[i], count + 1); } else { mp.put(nums[i], 1); } } // 遍历map,取出只出现1次的数 Set<Integer> keys = mp.keySet(); for (int key : keys){ if (mp.get(key) == 1) return key; } return 0;}// 方法2实现public int singleNumber2(int[] nums){ int[] bitnum = new int[32]; for (int i = 0; i < bitnum.length; i++){ bitnum[i] = 0; } int result = 0; for (int i = 0; i < 32; i++){ for (int j = 0; j < nums.length; j++){ bitnum[i] += (nums[j] >> i) & 1; } result |= (bitnum[i] % 3) << i; } return result;}// 方法3实现public int singleNumber(int[] nums){ int one = 0; int two = 0; int three = 0; for (int i = 0; i < nums.length; i++){ two |= one & nums[i]; one ^= nums[i]; three = one & two; one &= ~three; two &= ~three; } return one;}
0 0
- leetcode_137 Single Number II
- leetcode_137. Single Number II 只出现一次的数字 II 偏离了题目考点,主要是为了写下java
- Single Number & Single Number II
- Single Number & Single Number II
- Single Number II - leetcode
- Leetcode: Single Number II
- Single Number II
- Single Number II
- [LeetCode] Single Number II
- LeetCode: Single Number II
- leetcode -- Single Number II
- [leetcode]Single Number II
- [LeetCode] Single Number II
- 【leetcode】Single Number II
- Single Number I & II
- LeetCode:Single Number II
- Leetcode: Single Number II
- Single Number II
- jmeter3.0 源码分析之:对HTTPS协议的支持
- Configuring Fair Scheduler in Hadoop Cluster
- bzoj4260 Codechef REBXOR
- 实现自己的printf函数(2)
- Java 加密解密基础
- leetcode_137 Single Number II
- 几编有关证书、数据加密解密和签名的好文章
- JAVA设计模式(01_1):创建型-工厂模式【工厂方法模式】(Factory Method)
- bzoj1853【SCOI2010】幸运数字
- 1011. A+B和C (15)
- eclipse安装Genymotion插件
- Contiki协议栈Rime:广播ibc
- 容器就像骑摩托
- linux 下解压及创建 tar.xz