要求:
给定一个整型数组,其中除了一个元素之外,每个元素都出现三次。找出这个元素
注意:算法的时间复杂度应为O(n),最好不使用额外的内存空间
难度:中等
分析:
与#136类似,都是考察位运算。不过出现两次的可以使用异或运算的特性 n XOR n = 0, n XOR 0 = n,即某一位上出现偶数次1将该位置为0,出现奇数次1将该位置为1,这样扫一遍数组即可得到结果。
类似的,对于本题出现三次的情况,我们需要构造一个与异或类似的运算,使某一位出现三次1时置为0,出现3n+1次1时置为1。取三个整型值ones, twos, threes,均初始化为0,分别用于记录某一位出现1的次数。为简单起见,设输入数组M = {1,1, ... 1}, M中元素个数为m,则对于每一个输入项M[i],令:
twos = twos | ones & M[i]
ones = ones ^ M[i]
threes = ones & threes
ones = ones & ~threes // 当threes为1时将ones和twos置为0
twos = twos & ~threes
故m=3n时,threes = 1, m=3n+1时,ones = 1。
解决方案:
Java - 248ms
public int singleNumber(int[] A) { if(A.length==0) { return 0; } int ones=0, twos=0, threes=0; for (int i=0;i<A.length;i++){ twos |= ones & A[i]; ones = ones ^ A[i]; threes = ones & twos; ones = ones & ~threes; twos = twos & ~threes; } return ones; }
相关推荐
《位运算处理数组中的数——以LeetCode Single Number II为例》 在计算机科学中,位运算是一种高效且灵活的数据处理手段,尤其在处理数组中特定数值的问题时,它能展现出强大的能力。LeetCode上的Single Number II...
136_single_number.py # 位操作:异或(xor)操作 x ^ 0 = x; x ^ x = 0 sum 001_two_sum.py # 求list中能加和成指定值的两个位置 015_3_sum**.py # 求list中能加和成0的三个值 数列 004_median_of_two_sorted_arrays....
这些文件名可能类似于"Day01_SingleNumber.cpp"、"Day02_ValidPalindrome.cpp"等,按照日期和题目内容命名,方便查阅和学习。通过查看和分析这些源代码,我们可以深入了解每道题目的解题思路,学习不同算法的应用,...
在本压缩包中,我们关注的是一个Python编程与LeetCode面试相关的题目——“只出现一次的数字II”(Single Number II)。这是一道常见的数据结构与算法问题,常常出现在求职面试中,对于考察应聘者对位操作、哈希表...
- **2.1.24 Single Number II** - 找出数组中只出现一次的数字,其余数字均出现三次。 - 实现思路:位操作,利用位掩码记录每位出现次数。 - **2.2 单链表** - **2.2.1 Add Two Numbers** - 两个链表表示的...
- **单一数字问题(Single Number)**: 找出数组中唯一的不重复的数字。 - **快乐数(Happy Number)**: 判断一个数字是否快乐。 - **二进制中的1的个数(Count 1 in Binary)**: 计算一个整数的二进制表示中有多少个1。 ...
3. **Single Number** (数组中只出现一次的数字): 题目要求找出数组中唯一出现一次的数字,其余数字都出现了两次。这涉及到位运算,可以利用异或操作符在Java中解决这个问题,因为任何数与其自身异或的结果是0,所有...
public int singleNumber(int[] nums) { int res = 0; for (int n : nums) { res = res ^ n; } return res; } ``` **解析:** 这段代码巧妙地利用了异或运算的特性来解决问题。异或运算有以下特点: 1. 任何数...
function singleNumber($nums) { $result = 0; foreach ($nums as $num) { $result ^= $num; } return $result; } ``` 这段代码中,`$result`初始值为0,然后遍历数组`$nums`,对每个元素执行异或操作,最终...
只出现一次的数字 III(Single Number III)**:这是一道关于数组和位操作的题目,要求找出数组中唯一一个只出现一次的数字,而其他数字都出现两次。可以利用异或操作实现。 7. **338. 计数质数(Counting Bits)**:...
def singleNumber(nums): single_num = 0 for num in nums: single_num ^= num return single_num ``` 在这个代码中,`single_num`初始值为0,然后遍历整个数组`nums`,对每个元素执行异或操作。由于每个元素...
7. **位运算**:用于高效地处理整数,例如在`SingleNumber.java`中找出只出现一次的数字。 8. **设计模式**:如工厂模式、单例模式、观察者模式等。虽然LeetCode主要关注算法,但某些问题可能需要设计合理的类结构...
- "数组中两个数字只出现一次"(Single Number II)则是进一步考察位运算技巧。 ** Miscellaneous(杂项)** 杂项部分包括了一些不那么容易归类的问题,如螺旋矩阵(Spiral Matrix)、整数转罗马数字(Integer to ...
int singleNumber(vector<int>& nums) { int result = 0; for (int num : nums) { result ^= num; } return result; } ``` 2. **使用异或查找字符串中的新增字符**: 类似于找到数组中唯一数字的方法,...
2. **位运算中只出现一次的数字(Single Number)**:要求在只使用常数空间的情况下,找出数组中唯一的不重复的数字。 以上只是leetcode官方50题中的部分题目和相关知识点的简要介绍,每道题目均要求面试者具备良好...
public int singleNumber(int[] nums) { int result = 0; for (int num : nums) { result ^= num; } return result; } ``` 这段代码简洁明了,时间复杂度为O(n),因为只遍历了一次数组。空间复杂度为O(1),...
3. **Single Number**:在一个只包含两个重复数字的整数列表中找到唯一的单个数字。利用Python的位运算,可以实现快速查找单数。 4. **Same Tree**:判断两棵树是否结构相同且对应节点值相等。这涉及到深度优先搜索...
def singleNumber(self, nums: List[int]) -> int: nums.sort() for i in range(0, len(nums)-1, 2): if nums[i] != nums[i + 1]: return nums[i] return nums[-1] ``` ### 数学方法 第二种方法利用了数学...
在给定的代码示例中,我们看到一个名为`Solution`的类,其中包含一个公共成员函数`singleNumber`,用于解决这个问题。这个函数接受一个整数向量`nums`作为输入,返回只出现一次的数字。 算法的核心思想是利用位操作...
vector<int> singleNumber(vector<int>& nums) { int xor_two = nums[0]; int last_bit = 0; vector<int> result = {0,0}; for(int i = 1; i (); i++) xor_two ^= nums[i]; last_bit = xor_two & (~(xor_two ...