面试题:找出数组中只出现一次的数字(二)

难度:中等

一个整数数组,除了一个数之外所有数字都出现了3次,找出这个数字来。

注意: 你的算法应该是线性运行复杂度,且不能使用额外内存空间。

答案:

public class Solution {
    public int singleNumber(int[] nums) {
        int ones = 0, twos = 0, threes = 0;

        for (int i = 0; i < nums.length; i++) {
          // twos holds the num that appears twice
          twos |= ones & nums[i];

          // ones holds the num that appears once
          ones ^= nums[i];

          // threes holds the num that appears three times
          threes = ones & twos;

          // if num[i] appears three times
          // doing this will clear ones and twos
          ones &= ~threes;
          twos &= ~threes;
        }

        return ones;
    }
}
时间: 2024-08-05 19:36:53

面试题:找出数组中只出现一次的数字(二)的相关文章

面试题:找出数组中只出现一次的数字

难度:中等 一个整数数组,除了一个数之外所有数字都出现了2次,找出这个数字来. 注意: 你的算法应该是线性运行复杂度,且不能使用额外内存空间. 答案: public class Solution { public int singleNumber(int[] nums) { int n =0; // as we know that bitwise XOR in Java // 0 ^ N = N // N ^ N = 0 for(int i=0; i!=nums.length; i++) { n

40 - 找出数组中只出现一次的数字

题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.编写程序找出这个两个只出现一次的数字.要求时间复杂度O(n),空间复杂度O(1). 如 {2,4,3,6,3,2,5,5},输出{4,6} 解析: 空间复杂度为O(1)断绝了用hash-table的思路,时间复杂度O(n)断绝排序的思路. 如何判断一个数字出现2次呢? 计数 异或:如果出现2次,任意数字和自己异或都为0 异或的性质: 任何数字和 0 异或,都为它本身. 任意数字和自己异或都为0. 由于成对出现的元素异或结果为 0

找出数组中只出现一次的数字

题目 : 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 解析 首先:位运算中异或的性质:两个相同数字异或=0,一个数和0异或还是它本身.异或运算满足交换律结合律. 当只有一个数出现一次时,我们把数组中所有的数,依次异或运算,最后剩下的就是落单的数,因为成对儿出现的都抵消了. 依照这个思路,我们来看两个数(我们假设是AB)出现一次的数组.我们首先还是先异或,剩下的数字肯定是A.B异或的结果,这个结果的二进制中的1,表现的是A和B的不同的位.我们就取第

【剑指Offer学习】【面试题40:数组中只出现一次的数字】

题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 举例说明 例如输入数组{2, 4, 3, 6, 3, 2, 5 },因为只有4 .6 这两个数字只出现一次,其他数字都出现了两次,所以输出4和6 . 解题思路 这两个题目都在强调一个(或两个)数字只出现一次,其他的出现两次.这有什么意义呢?我们想到异或运算的一个性质:任何一个数字异或它自己都等于0.也就是说, 如果我们从头到尾依次异或数组中的每一个数

LeetCode&mdash;&mdash;Single Number II(找出数组中只出现一次的数2)

问题: 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?   Single Number I 升级版,一个数组中其它数出现了

面试题---找出数组中两个只出现一次的数

题目描述:给一个数组,里面有两个数只出现一次,其它的数都出现两次,请找出这两个数: 样例:输入 2 4 2 7 4 9 输出 7 9 思路:假定要找出的这两个数为x.y   把所有的数异或,结果是x与y异或的值,那么肯定不为0,那么这个值的二进制至少有一位为1,也就是说x和y的二进制在这一位上必定一个为0,一个为1,那么可以根据这一位把这个数组分成两个数组,x和y在不同的数组里,接下来对每个数组直接异或出的值就是结果了: 代码如下: #include <iostream> #include &

LeetCode&mdash;&mdash;Single Number(找出数组中只出现一次的数)

问题: Given an array of integers, every element appears twice except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?   分析: 数组中的数除了一个只出现了一次之外,其它都出现了两次, 要找出只出

找出数组中只出现一次的数

这个题目有三种变形. 第一种,一个数组中所有数都出现了两次,只有一个数出现了一次,求这个数.这个题比较简单,只要知道数字间异或的特性,就可以很容易的得出答案. int find_num_appear_once(int *data, int length){ if(data==NULL || length==0)return; int i=0; int res=0; for(;i<length;i++){ res ^= data[i]; } return res; } 第二种,一个数组中所有的数都

【剑指offer】面试题40:数组中只出现一次的数字

题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 因为只有两个只出现一次的数字,所以所有数字进行异或之后得到值res一定不是0.这样,res中其中至少1bit不是0,我们根据这个bit是否为0把数组分为两组,两个只出现一次的数字肯定在不同的组.其他出现两次的数组两个肯定在相同组,而两个相同的数组异或之后是0,任意一个数字与0异或还是该数字本身. 代码: class Solution { public: void FindNumsAppe