137. 只出现一次的数字 II

题目

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,3,2]
输出: 3

示例 2:

输入: [0,1,0,1,0,1,99]
输出: 99

思路

计算二进制下,各个位上1的个数。

因为只有一个数出现1次,其他都出现3次,所以各个位上1的个数%3就是只出现1次的数的二进制表示。

  比如[2,2,4,2],二进制就是[0010,0010,0100,0010],那么二进制对应位上1的个数位0 1 3 0,然后%3位0 1 0 0。也就是只出现1次的4。

因为%3那么1的个数可能为0,1,2。用2位二进制表示即可。

  比如a=0010,b=0001(a高位,b低位)表示各个位上1的个数:0 0 2 1 [00 00 10 01]。

假设下一个数为c,可以知道:1、c的二进制位上为1时,b对应位肯定会发生变化。2、只有b对应位上由1变为0时,a对应位才会发生变化。3、当某个位上1的个数为3时,即a、b对应位都为1,置为0.

那么1、只要c对应位是1,b对应位就变化:t=b^c;2、b对应位由1变为0时,a变化:a=c&b^a;(b更新:b=t;)3、当a、b对应位都为1时,置为0:temp=a;a=a^a&b;b=b^temp&b;(&优先级>^)

因为最后的结果表示的是一个数的二进制,那么对应位的1的个数只可能是1或0,那么低位的b就是最终的结果。

代码

public static int singleNumber(int[] nums) {
        int a=0;
        int b=0;
        for(int i=0;i<nums.length;++i){
            int t=b^nums[i];
            a=nums[i]&b^a;
            b=t;
            int c=a;
            a=a^a&b;
            b=b^c&b;
        }
        return b;
    }


原文地址:https://www.cnblogs.com/xiangguoguo/p/9568434.html

时间: 2024-11-07 19:42:51

137. 只出现一次的数字 II的相关文章

[LeetCode] 137. 只出现一次的数字 II

题目链接 : https://leetcode-cn.com/problems/single-number-ii/ 题目描述: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例: 示例 1: 输入: [2,2,3,2] 输出: 3 示例 2: 输入: [0,1,0,1,0,1,99] 输出: 99 思路: 占坑, 这道题要重点研究一下! 代码: 原文地址:htt

LeetCode 137 Single Number II(只出现一次的数字 II)(*)

翻译 给定一个整型数组,除了某个元素外其余的均出现了三次.找出这个元素. 备注: 你的算法应该是线性时间复杂度.你可以不用额外的空间来实现它吗? 原文 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 im

LeetCode 136 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 i

【LeetCode-面试算法经典-Java实现】【137-Single Number II(只字出一次的数字II)】

[137-Single Number II(只出现一次的数字II)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 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 imple

《剑指offer》第五十六题II:数组中唯一只出现一次的数字

// 面试题56(二):数组中唯一只出现一次的数字 // 题目:在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次.请 // 找出那个吃出现一次的数字. #include <cstdio> #include <exception> int FindNumberAppearingOnce(int numbers[], int length) { if (numbers == nullptr || length <= 0) throw new std::exceptio

【01】数组中只出现一次的数字

其他两次,一个一次/其他三次,一个一次/其他两次,两个一次 ============================================ 任何一个数字异或他自己都得零. 注意异或运算的初始化变量为0,因为0异或任何数字都得那个数字自身. Single Number 1.一个整型数组中除了一个数字之外,其他数字都出现了两次 ,找出这个出现一次的数字. 解法一,异或是重复的消失,剩下的就是要找的数字. C++ Code 12345678910111213   int singleNumb

LintCode(101)删除排序数组中的重复数字 II

题目 跟进"删除重复数字": 如果可以允许出现两次重复将如何处理? 您在真实的面试中是否遇到过这个题? Yes 样例 给出数组A =[1,1,1,2,2,3],你的函数应该返回长度5,此时A=[1,1,2,2,3]. 分析 与上题思路相同,只需要增加一个记录元素出现次数的变量即可,限制最多出现2次. Python代码 class Solution: """ @param A: a list of integers @return an integer &q

问题 C: 幸运数字II(4,7)

问题 C: 幸运数字II 时间限制: 1 Sec  内存限制: 128 MB[提交] [状态] 题目描述 数字4和7是幸运数字,而其他的都不是幸运数字.一个整数是幸运数字,当且仅当它的十进制表示只包含幸运数字. 现在让你给出第K大的幸运数字. 输入 第一行一个整数K(1<=K<=1,000,000,000) 输出 第K大的幸运数字. 样例输入 Copy 1 样例输出 Copy 4 首先把4和7化为0和1,分别对应起来看,题目就成了求第n位的二进制数.但是这个和普通的二进制数有点不一样, 各种进

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

题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 题目分析 剑指Offer(纪念版)P211 ① 自己与自己异或为0 ② 0与数A异或为A ③ 异或满足交换律 代码实现 void FindNumsAppearOnce(int data[], int length, int* num1, int* num2) { if (data == NULL || length < 2) return; in