数组中只出现一次的数字 python_数组中唯一只出现一次的数字

本文介绍了多种编程语言(如C++, Java, Python)解决数组中唯一出现一次的数字的问题。算法包括位运算、哈希映射、计数法等,通过分析数字的二进制位来找出只出现一次的数字。文章提供了详细的代码实现及思路解析。
摘要由CSDN通过智能技术生成

最佳答案

AcWing 74. 数组中唯一只出现一次的数字

class Solution {

public:

int findNumberAppearingOnce(vector[HTML_REMOVED]& nums) {

//vector[HTML_REMOVED] a;

unordered_map[HTML_REMOVED] res;

for(int i = 0;i < nums.size();i ) res[nums[i]];

for(unordered_map[HTML_REMOVED]::iterator iter=res.begin();iter!=res.end();iter++)

{

// 如果value=1,输出key值并压入a容器中

if(iter->second == 1) return iter->first;

}

//return a;

}

};

发布于 2020-02-16

最佳答案

AcWing 74. 数组中唯一只出现一次的数字——Java

算法1

(位运算) $O(n)$

计算所有数字每一位的个数bitCount,bitCount除以3的余数就是只出现一次的数对应位上的数。

Java 代码

class Solution {

public int findNumberAppearingOnce(int[] nums) {

int ans = 0;

for(int i=0;i<32;i++) {

int bitCount = 0;

for(int j=0;j

if (((nums[j] >> i) & 1) == 1) {

bitCount++;

}

}

if(bitCount % 3 == 1) {

ans |= 1 << i;

}

}

return ans;

}

}

发布于 2020-02-16

最佳答案

AcWing 74. 数组中唯一只出现一次的数字-java

java 代码

class Solution {

public int findNumberAppearingOnce(int[] nums) {

int[] bitSum = new int[32]; //int在二进制下是32位

for (int num : nums) { //外层循环遍历数组的每个数

int bitMask = 1; //数和bitMask & ,则对应位不为1就为0

for (int j = 31; j >= 0; j--) { //判断每个数的32个位置上的数是1还是2

int bit = num & bitMask;

if (bit != 0) bitSum[j] += 1; //若为1则对应加上1

bitMask = bitMask << 1;

}

}

StringBuilder s1 = new StringBuilder();

for (int i = 0; i < 32; i++)

s1.append(bitSum[i] % 3);

String s2 = s1.toString();

return Integer.parseInt(s2, 2); //二进制字符串转化为十进制整数

}

}

发布于 2020-02-16

最佳答案

AcWing 74. 数组中唯一只出现一次的数字

class Solution {

public int findNumberAppearingOnce(int[] nums) {

Map[HTML_REMOVED]map=new HashMap;//根据Map集合的特点进行解答

for(int i:nums){//遍历数组将数组的元素存在Map集合的k值

if(map.containsKey(i)){//判断数组元素是否已经存在Map集合中

Integer value=map.get(i);

value++;

map.put(i,value);

}else

map.put(i,1);

}

int d=0;

Set[HTML_REMOVED]set=map.keySet();

for(int i:set){

if(map.get(i)==1)

d=i;

}

return d;

}

}

发布于 2020-02-16

最佳答案

AcWing 74. 数组中唯一只出现一次的数字--python

python3 代码

class Solution(object):

def findNumberAppearingOnce(self, nums):

"""

:type nums: List[int]

:rtype: int

"""

count = [0] * 32 # 统计每1个二进制位上,1出现的次数

for num in nums:

k = 0

while k < 32:

count[k] += num >> k & 1

k += 1

res = 0

for i in range(32):

# 因为其他数字都出现了三次,只有一个数字出现了一次

# 也就说明count[i]%3等于0或1

res += count[i] % 3 * 2 ** i

return res

发布于 2020-02-16

最佳答案

AcWing 74. 数组中唯一只出现一次的数字

题目描述

blablabla

样例

blablabla

算法1

(暴力枚举) $O(n)$

状态机连续遇到n个1以后变为0,遇到0直接变为0

时间复杂度分析:blablabla

C++ 代码

class Solution {

public:

int findNumberAppearingOnce(vector& nums) {

int one=0,two=0;

for(auto x:nums)

{

one=(one^x)&~two;

two=(two^x)&~one;

}

return one;

}

};

算法2

(暴力枚举) $O(n^2)$

blablabla

时间复杂度分析:blablabla

C++ 代码

blablabla

发布于 2020-02-16

最佳答案

AcWing 74. 数组中唯一只出现一次的数字

sort完之后,3个一组,如果头尾不等,说明单独的数在这三个数中

如果头和右一位数相等 尾即为答案 否则头为答案

class Solution {

public:

int findNumberAppearingOnce(vector[HTML_REMOVED]& nums) {

sort(nums.begin(),nums.end());

for(int i=0;i

if(nums[i]!=nums[i+2]) {

if(nums[i]!=nums[i+1]) return nums[i];

return nums[i+1];

}

}

}

};

发布于 2020-02-16

最佳答案

AcWing 74. 数组中唯一只出现一次的数字

算法

看每一位1的数量

C++ 代码

class Solution {

public:

int findNumberAppearingOnce(vector& nums) {

int ans = 0;

for (int i = 31; i >= 0; --i) {

int cnt = 0;

for (int x: nums) {

if (x >> i & 1) {

cnt ++;

}

}

if (cnt % 3 == 1) {

ans = (ans * 2) + 1;

}

else {

ans = ans * 2;

}

}

return ans;

}

};

发布于 2020-02-16

最佳答案

AcWing 74. 数组中唯一只出现一次的数字-java

java 代码

class Solution {

public int findNumberAppearingOnce(int[] nums) {

int len = nums.length;

int[] a = new int[32];

for(int i = 0; i

int j = 0;

int t = nums[i];

while(t!=0){

if((t&1)!=0)

a[j]++;

j++;

t = t >> 1;

}

}

int re = 0;

for(int i = 0; i<32; i++){

a[i] = a[i]%3;

re = re+ a[i]* (int)Math.pow(2, i);

}

return re;

}

}

发布于 2020-02-16

最佳答案

AcWing 74. Python 装x解法 数组中唯一只出现一次的数字

Life is short.

class Solution(object):

def findNumberAppearingOnce(self, nums):

a = b = 0

for n in nums:

a = (a ^ n) & ~b

b = (b ^ n) & ~a

return a

发布于 2020-02-16

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值