Leetcode: SingleNumber II

本文介绍了一种算法,用于在给定整数数组中找出仅出现一次的元素,所有其他元素都出现三次。算法运行时间复杂度为线性,并且不使用额外内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

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

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

解答:(这是参照别人的答案一步步想通的)

方法一:

int 型数据共有32位,可以用32个变量存储 这n个元素中各个二进制位上1 出现的次数,最后在进行模3操作,如果为1,那说明这一位是要找元素二进制表示中为 1 的那一位。

int singleNumber(int A[], int n)
{
	int bits[32] = {0};//一个整数32位
	int result = 0;//记录结果
	for (int i = 0; i < 32; i++)
	{
		for (int j = 0; j < n; j++)
		{
			//(A[j]>>i)&1的值为0或者1,表示第j个数字的第i位为0或者1
			//将其结果相加便得到第i位为1的个数
			bits[i] += (A[j]>>i)&1;
		}
		//将第i位的结果放到第i位上去
		result |= (bits[i]%3)<<i;
	}
	return result;
}

方法二:

利用3个变量分别保存各个二进制位上1出现1次、2次、3次的情况,最后只需返回出现1次的那个变量就行了。

int singleNumber(int A[], int n)
{
	int one=0, two=0, three=0;  
	for(int i = 0; i< n; i++){  
		two |= one & A[i];  
		one ^= A[i];  
		three = one & two;
		//每次将达到3的清零
		one &= ~three;  
		two &= ~three;  
	}  
	return one;  
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值