题目分析:
给定一个数组,里面只有一个数只出现一次,其他的数均出现三次,请找出这个只出现一次的数。
解题思路:
方法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; }
leetcode_137 Single Number II
最新推荐文章于 2020-08-16 20:42:49 发布