Leetcode Single Number II (面试题推荐)

简介: 给你一个整数数组,每个元素出现了三次,但只有一个元素出现了一次,让你找出这个数,要求线性的时间复杂度,不使用额外空间。

还记得《剑指offer》和《编程之美》等书上多次出现的找一个数组中只出现一次的数那个题吗?


   leetcode也有这道题 链接here  相信大家都知道用异或在O(n)的时间复杂度内求出的方法,这里不再赘述。


下面就是上题的升级版


Given an array of integers, every element appears three times except for one. Find that single one.


Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?


  给你一个整数数组,每个元素出现了三次,但只有一个元素出现了一次,让你找出这个数,要求线性的时间复杂度,不使用额外空间。


  这样就不能使用异或的方法了,把所有元素以后得到的就是所有元素的异或值了,对我们没有任何帮助。


  这个问题依旧使用位运算来解决,不过更加复杂。


  我们用三个变量one two three,分别存储二进制未分别出现一次 两次 三次的位。

class Solution {
public:
    int singleNumber(int A[], int n) {
        int one = 0, two = 0, three = 0;
        for(int i = 0; i < n; i++)
        {
            three = two & A[i];                    //出现三次的位肯定是由出现两次的得到的
            two = two | ones & A[i];          //出现两次的肯定是出现一次的得到的,不过还有原有的所以要或
            one = one | A[i];                       //计算出现一次的位  
            two = two & ~three;               //去掉二进制中出现三次的位
            ones = one & ~three;               //去掉二进制中出现三次的位</span>
        }
        return one;                                     //最终twos three都为0,one就是我们要的答案
    }
};
目录
相关文章
|
1月前
|
算法
【数组相关面试题】LeetCode试题
【数组相关面试题】LeetCode试题
|
1月前
力扣面试经典题之哈希表
力扣面试经典题之哈希表
18 0
|
1月前
|
存储
力扣面试经典题之数组/字符串
力扣面试经典题之数组/字符串
23 0
|
3月前
|
存储 算法 程序员
【Leetcode 程序员面试金典 01.01】判定字符是否唯一 —— 位运算|哈希表
可以使用哈希表或位运算来解决此问题:由题可知s[i]仅包含小写字母,int[26]即能表示字符的出现次数;
|
3月前
|
算法 程序员 索引
【Leetcode 程序员面试金典 02.08】 —— 环路检测 |双指针
我们可以使用双指针解决本题,由数学推导可知:a 的距离为(环长度的倍数 - b),即 tmp 指针从头节点走到环开头节点等于 slow 指针走到环开头节点的距离
|
3月前
|
Java 程序员
【Leetcode 程序员面试金典 05.01】插入 —— 位运算
位运算问题,只需要把 N 的 i 到 j 位都置 0 后再和 M 左移 i 位的结果进行按位或即可
|
1月前
力扣面试经典题之二叉树
力扣面试经典题之二叉树
16 0
LeetCode | 面试题 02.02. 返回倒数第 k 个节点
LeetCode | 面试题 02.02. 返回倒数第 k 个节点
|
2月前
|
JavaScript 前端开发 C语言
leetcode每日一题 2021/4/2 面试题 17.21. 直方图的水量
leetcode每日一题 2021/4/2 面试题 17.21. 直方图的水量
23 0
|
24天前
|
算法
【力扣经典面试题】121. 买卖股票的最佳时机
【力扣经典面试题】121. 买卖股票的最佳时机