算法题--数组中出现次数不同的数字

1. 初级版

描述:一个整型数组里除了1个数字之外,其他的数字都出现了两次,请写程序找出这个只出现一次的数字。

 思路:利用异或的特性,x^y^x=x^x^y=y。对数组所有元素进行一次异或操作,最后得到的就是只出现一次的数字。

 

1.1变化版

描述:一个整型数组里除了2个数字之外,其他的数字都出现了两次,请写程序找出这两个只出现1次的数字。

 

思路:

1. 两个数字肯定是不同的,则必有某一位上,两个数字是不同的;

2. 可以对数组所有元素进行一次异或操作,得到两个数字哪一位是不同的;

3. 然后根据这一位将整个数组分为两个数组,则两个数会分在不同的数组,并且相同的数一定会分在同一个数组;

4. 之后利用异或的方式得到数字。

 

2. 进阶版

描述:一个整型数组里除了1个数字之外,其他的数字都出现了三次,请写程序找出这个只出现一次的数字。

 思路:最基本的工具还是利用异或的特性,但在使用方法上要做一些改变。

 

用两个数字s1,s0记录每一位1的个数(s1为高位数,s0位低位数),如果等于3(即011)则置零。设s1_k为高位数的第k位、s0_k为低位数的第k位,A_k为其中一个数的第k位:

 

则满足:

输入

输出

 

S1_k

S2_k

A_k

S1_k

S2_k

 

0

0

0

0

0

 

0

0

1

0

1

 

0

1

0

0

1

 

0

1

1

1

0

 

1

0

0

1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值