【剑指offer】【九度oj】数组中只出现一次的数字

本文介绍了一种高效算法,用于找出数组中仅出现一次的两个数字。通过异或操作分组,实现快速查找。

题目:数组中只出现一次的数字

时间限制:1 秒

内存限制:32 兆


题目描述:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
输入:
每个测试案例包括两行:
第一行包含一个整数n,表示数组大小。2<=n <= 10^6。
第二行包含n个整数,表示数组元素,元素均为int。
输出:
对应每个测试案例,输出数组中只出现一次的两个数。输出的数字从小到大的顺序。
样例输入:
8
2 4 3 6 3 2 5 5
样例输出:
4 6
分析:如果数组中仅有一个只出现一次的数字,其他数字都是出现两次,那么将所有的数进行异或操作,可得到仅出现一次的数。现在的问题是数组中有两个仅出现一次的数字,那么我们可把原数组分为两组,每一组包含一个只出现一次的数和若干对出现2次的数,然后两组分别进行组内异或,就可得两个只出现一次的数。

具体步骤:

    第一步,原数组所有元素异或,必得一个不为零的数,而且此数是由两个只出现一次的数异或得来的。

    第二步,找出此数从低位到高位第一次为1的比特位置,用此位置的1进行分组,即原数组所有此位置为1的元素为一组,所有此位置为0的元素为一组。

    第三步,对两个数组分别进行异或,可得数组中只出现一次的两个数。


#include <stdio.h>
#include <stdlib.h>

int a[1000001];

int min( int a, int b )
{
	return a<b?a:b;
}

int max( int a, int b )
{
	return a>b?a:b;
}

int findFirstBit1(int n)
{
	int count = 1;
	while(!( n & 1))
	{
		n = n>>1;
		count++;
	}
	return count;
}

int main()
{
	int temp,i,n,b1,b2,num;
	while(scanf("%d",&n)!=-1)
	{
		//利用异或操作,最后temp为数组中两个只出现一次的数的异或值
		temp = 0;
		for( i=0; i<n; i++)
		{
			scanf("%d",&a[i]);
			temp = temp^a[i];
		}
		//从temp中由低位到高位寻找,找到最先出现1的比特位,并记录下位置
		num = findFirstBit1(temp);
		//将数组一分为二,每一部分都是包含一个只出现一次的数和若干对出现2次的数。
		//相当于对两个数组分别进行异或,最后得到的b1,b2为数组中只出现一次的两个数。
		b1 = b2 = 0;
		for( i=0; i<n; i++ )
		{
			if((a[i]>>(num-1)) & 1 == 1)
				b1 = b1^a[i];
			else
				b2 = b2^a[i];
		}
		printf("%d %d\n",min(b1,b2),max(b1,b2));
	}
	return 0;
}

注:此程序在九度OJ上用C++可通过,但是用C则判超时。






内容概要:该文档详细介绍了由JEDEC固态技术协会发布的Universal Flash Storage(UFS)4.1标准(编号JESD220G),旨在消除制造商与采购商之间的误解,促进产品的互换性和改进,同时协助用户选择和获取适当的产品。主要内容包括了UFS应用层的SCSI命令、命令描述符块(CDB)、读写错误恢复模式页面及其默认值设置。此外,还涵盖了一系列SCSI命令(如INQUIRY、MODE SELECT、READ/WRITE以及FORMAT UNIT等)。文档进一步探讨了UFS安全机制,尤其是设备数据保护机制及基于硬件的安全防护措施,如RPMB操作流程和安全协议的输入/输出指令。还提到了启动配置与初始化流程以及相关的查询函数传输协议服务。最后涉及一些关键性的更新变化如新增的队列深度定义、动态容量资源管理策略、逻辑单元的可选功能变为必选项等特性。适合人群:具备一定电子工程或计算机硬件背景的专业人士及研发工程师,特别是从事嵌入式系统开发或者存储设备研究方向的技术人员。使用场景及目标:本标准适用于希望深入了解高速闪存设备的工作机制和技术细节的研发团队;可用于指导设计兼容性强且性能优越的新一代移动终端内部存储解决方案;帮助硬件开发商确保所生产产品符合国际通行的标准规范从而更容易进入全球市场。其他说明:此文件由JEDEC标准化组织官方公布并经过董事会审议批准。虽然可以在网站免费下载但请注意引用时保持尊重版权。如果您有任何疑问或意见可以发送至JEDEC官方网站查询更多联系信息。该文档不仅仅是规定了一套新的行业准则它更代表着整个行业内达成共识的技术发展方向并且可能会对未来的技术发展产生深远的影响。文中提供的信息不仅限于当前版本也可能成为未来美国国家标准的一部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值