[分析]
此题找到三种符合题意的解法,只理解了解法1,解法2有很详细的解析,理解中~
解法1:对于32个数位,遍历数组统计每一位上 1 出现的次数,若 mod 3为1说明仅出现一次的数字该位为1。该解法可简单套用到变形题目:除1个数字外其余均出现k次。
注意此题可一般化为:
给定一个数组,除了一个数出现 k 次外其他数字均出现 p 次,其中 p > 1, k >= 1, p % k != 0, 求那个出现 k 次的数字。解法2思路可解。
感谢yb君耐心详细解释,并分享理解代码的有效方法~ 代入建立例子一步步执行代码非常有助于理解,尤其是这么精短的代码。
对于singleNumber2
twos ones mask ones twos
1 0 1 1 1 0
1 1 0 1 0 1
1 1 1 0 0 0
1 0 1 1 1 0
对于singleNum
one two
1 1 0
1 0 1
1 0 0
1 1 0
对当前的我来说,文字解释还是非常有助于我理解代码的,leetcode的那篇解析还是非常不错,他试图解释思路是怎么一步步形成的。现在基本理解了后两种方法的正确性,但自己是万万想不出这么巧妙的位运算技巧的~
[ref]
http://blog.csdn.net/kenden23/article/details/13625297
http://www.cnblogs.com/daijinqiao/p/3352893.html
https://leetcode.com/discuss/6632/challenge-me-thx
解法2非常详尽的解析
https://leetcode.com/discuss/31595/detailed-explanation-generalization-bitwise-operation-numbers
public class Solution {
public int singleNumber1(int[] nums) {
int ret = 0;
for (int i = 0; i < 32; i++) {
int counter = 0;
for (int num : nums) {
if (((num >> i) & 1) == 1)
counter++;
}
if (counter % 3 == 1)
ret |= (1 << i);
}
return ret;
}
// the masks will be 0 only when the counter reaches k and be 1 for all other count cases
public int singleNumber2(int[] nums) {
int ones = 0, twos = 0, mask = 0;
for(int num : nums) {
twos |= (ones & num);
ones ^= num;
mask = ~(ones & twos);
ones &= mask;
twos &= mask;
}
return ones;
}
public int singleNumber(int[] nums) {
int ones = 0, twos = 0;
for(int num : nums) {
ones = (ones ^ num) & ~twos;
twos = (twos ^ num) & ~ones;
}
return ones;
}
}
分享到:
相关推荐
这道题是LeetCode中的第136题,名为“只出现一次的数字”(Single Number)。下面我们将详细探讨这个问题,以及如何用Python来解决它。 题目描述: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个...
在LeetCode中,这个问题被称为“Single Number”,其描述是:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。这是一个基础的位操作问题,要求在不使用...
public int singleNumber(int[] nums) { int result = 0; for (int num : nums) { result ^= num; } return result; } ``` 这段代码简洁明了,时间复杂度为O(n),因为只遍历了一次数组。空间复杂度为O(1),...
int singleNumber(vector<int>& nums) { int result = 0; for (int num : nums) { result ^= num; } return result; } ``` 2. **使用异或查找字符串中的新增字符**: 类似于找到数组中唯一数字的方法,...
def singleNumber(nums): xorResult = 0 for num in nums: xorResult ^= num bitPos = 1 while (xorResult & bitPos) == 0: bitPos left, right = 0, 0 for i in range(len(nums)): if (nums[i] & ...
public int singleNumber(int[] nums) { Set<Integer> set = new HashSet(); for (int num : nums) { if (!set.add(num)) { return num; } } return -1; } ``` 这样的例子还有很多,从基础的数组操作到高级...
【LeetCode 算法题库【136】——只出现一次的数字】 这道LeetCode中的算法问题主要考察的是在给定整数数组`nums`中,找到唯一一个只出现一次的数字,而其他所有数字都出现两次。解决这个问题涉及到几种不同的策略,...
在本文中,我们将深入探讨C++中的异或运算符及其在解决LeetCode问题时的应用。异或运算符("^")是C++中的一个二元运算符,它遵循以下规则:相同为0,相异为1。这意味着,如果两个操作数的位在任何位置上都是相同的...
标题 "数组中数字出现的次数II1" 描述了一个经典的编程问题,该问题涉及寻找一个在整数数组中仅出现一次的数字,而其他所有数字都出现三次。这是一个基于数组和哈希表的问题,通常在数据结构和算法的学习中会遇到,...