`
Cwind
  • 浏览: 265582 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
793bb7df-a2a9-312d-8cb8-b66c3af482d1
LeetCode题解
浏览量:53578
社区版块
存档分类
最新评论

LeetCode[位运算] - #137 Single Number II

阅读更多

原题链接:#137 Single Number II 

要求:

给定一个整型数组,其中除了一个元素之外,每个元素都出现三次。找出这个元素

注意:算法的时间复杂度应为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;
    }

 简单测试程序

2
1
分享到:
评论

相关推荐

    leetcode Single Number II - 位运算处理数组中的数 - 代金桥 - 博客园1

    《位运算处理数组中的数——以LeetCode Single Number II为例》 在计算机科学中,位运算是一种高效且灵活的数据处理手段,尤其在处理数组中特定数值的问题时,它能展现出强大的能力。LeetCode上的Single Number II...

    leetcode切割分组-leetcode:leetcode

    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....

    leetcode卡-LeetCode-July-Challenge:它由7月份31个C++语言日常问题的解决方案组成

    这些文件名可能类似于"Day01_SingleNumber.cpp"、"Day02_ValidPalindrome.cpp"等,按照日期和题目内容命名,方便查阅和学习。通过查看和分析这些源代码,我们可以深入了解每道题目的解题思路,学习不同算法的应用,...

    python-leetcode面试题解之第137题只出现一次的数字II-题解.zip

    在本压缩包中,我们关注的是一个Python编程与LeetCode面试相关的题目——“只出现一次的数字II”(Single Number II)。这是一道常见的数据结构与算法问题,常常出现在求职面试中,对于考察应聘者对位操作、哈希表...

    leetcode-cpp刷题

    - **2.1.24 Single Number II** - 找出数组中只出现一次的数字,其余数字均出现三次。 - 实现思路:位操作,利用位掩码记录每位出现次数。 - **2.2 单链表** - **2.2.1 Add Two Numbers** - 两个链表表示的...

    算法-leetcode-剑指offer上的题很多

    - **单一数字问题(Single Number)**: 找出数组中唯一的不重复的数字。 - **快乐数(Happy Number)**: 判断一个数字是否快乐。 - **二进制中的1的个数(Count 1 in Binary)**: 计算一个整数的二进制表示中有多少个1。 ...

    leetcode-answer-and-analysis(part).zip_图形图像处理_Java_

    3. **Single Number** (数组中只出现一次的数字): 题目要求找出数组中唯一出现一次的数字,其余数字都出现了两次。这涉及到位运算,可以利用异或操作符在Java中解决这个问题,因为任何数与其自身异或的结果是0,所有...

    leetcode简单+中等题目参考答案java版

    public int singleNumber(int[] nums) { int res = 0; for (int n : nums) { res = res ^ n; } return res; } ``` **解析:** 这段代码巧妙地利用了异或运算的特性来解决问题。异或运算有以下特点: 1. 任何数...

    php-leetcode题解之只出现一次的数字.zip

    function singleNumber($nums) { $result = 0; foreach ($nums as $num) { $result ^= $num; } return $result; } ``` 这段代码中,`$result`初始值为0,然后遍历数组`$nums`,对每个元素执行异或操作,最终...

    leetcode338-LeetCode:力码

    只出现一次的数字 III(Single Number III)**:这是一道关于数组和位操作的题目,要求找出数组中唯一一个只出现一次的数字,而其他数字都出现两次。可以利用异或操作实现。 7. **338. 计数质数(Counting Bits)**:...

    python-leetcode面试题解之第136题只出现一次的数字-题解.zip

    def singleNumber(nums): single_num = 0 for num in nums: single_num ^= num return single_num ``` 在这个代码中,`single_num`初始值为0,然后遍历整个数组`nums`,对每个元素执行异或操作。由于每个元素...

    java-leetcode-solutions:一些LeetCode问题的解决方案

    7. **位运算**:用于高效地处理整数,例如在`SingleNumber.java`中找出只出现一次的数字。 8. **设计模式**:如工厂模式、单例模式、观察者模式等。虽然LeetCode主要关注算法,但某些问题可能需要设计合理的类结构...

    leetcode java

    - "数组中两个数字只出现一次"(Single Number II)则是进一步考察位运算技巧。 ** Miscellaneous(杂项)** 杂项部分包括了一些不那么容易归类的问题,如螺旋矩阵(Spiral Matrix)、整数转罗马数字(Integer to ...

    leetcode解题笔记1

    int singleNumber(vector&lt;int&gt;& nums) { int result = 0; for (int num : nums) { result ^= num; } return result; } ``` 2. **使用异或查找字符串中的新增字符**: 类似于找到数组中唯一数字的方法,...

    leetcode官方50题算法详解

    2. **位运算中只出现一次的数字(Single Number)**:要求在只使用常数空间的情况下,找出数组中唯一的不重复的数字。 以上只是leetcode官方50题中的部分题目和相关知识点的简要介绍,每道题目均要求面试者具备良好...

    java面试-leetcode面试题解之第66题加一-java题解.zip

    public int singleNumber(int[] nums) { int result = 0; for (int num : nums) { result ^= num; } return result; } ``` 这段代码简洁明了,时间复杂度为O(n),因为只遍历了一次数组。空间复杂度为O(1),...

    Leetcode部分试题解析

    3. **Single Number**:在一个只包含两个重复数字的整数列表中找到唯一的单个数字。利用Python的位运算,可以实现快速查找单数。 4. **Same Tree**:判断两棵树是否结构相同且对应节点值相等。这涉及到深度优先搜索...

    LeetCode 算法题库【136】——只出现一次的数字

    def singleNumber(self, nums: List[int]) -&gt; int: nums.sort() for i in range(0, len(nums)-1, 2): if nums[i] != nums[i + 1]: return nums[i] return nums[-1] ``` ### 数学方法 第二种方法利用了数学...

    只出现一次的数字(统计1个数+取余)1

    在给定的代码示例中,我们看到一个名为`Solution`的类,其中包含一个公共成员函数`singleNumber`,用于解决这个问题。这个函数接受一个整数向量`nums`作为输入,返回只出现一次的数字。 算法的核心思想是利用位操作...

    C++:异或运算符大全

    vector&lt;int&gt; singleNumber(vector&lt;int&gt;& nums) { int xor_two = nums[0]; int last_bit = 0; vector&lt;int&gt; result = {0,0}; for(int i = 1; i (); i++) xor_two ^= nums[i]; last_bit = xor_two & (~(xor_two ...

Global site tag (gtag.js) - Google Analytics