您的位置:首页 > 其它

笔试题2-数组

2015-10-09 15:16 441 查看
例题1:

/*
* 这道题题目是,在一个数组中,只有两个数字出现过一次,其他所有的数字都在数组中出现过一次,找出这两个数。
* 分析: 用异或思想解决,因为除去两个特殊的数字外,其他所有数字都出现过两次,这些数字异或的结果为0。
*/

#include<iostream>

using namespace std;

void main()
{
int a[] = {2, 6, 3, 2, 7,6,8,7};
int xXory = 0;
int len=sizeof(a)/sizeof(a[0]);
for(int i =0; i<len; i++)
{
xXory ^=a[i];
} //循环结束后,xXory的值是x,y这两个不相同的数留下来的。
int mask=1;
//for(;(xXory&mask)==0; mask<<=1);
//由于xXory是x,y异或的结果,因此,用mask找到不同位,将其分为两拨,这样就可以找到x,y了。
while((xXory&mask)==0)
{
mask<<=1;
}
int x=0,y=0;
for(int i=0; i<len; i++)
{
if(a[i]&mask)
{
x^=a[i];
}
else{
y^=a[i];
}
}
cout<<x<<" "<<y<<endl;
}

例题2:

众数问题:

/*
* 众数问题,在数组中超过一半的数
* 分析: 去掉两个不同的数,众数不变;
*/

#include<iostream>

using namespace std;

void main()
{
int a[]= {6,2,2,2,4,2,2,5,6,4,3,2,2};
int count=0,x;
int len=sizeof(a)/sizeof(a[0]);
for(int i=0; i<len; i++)
{
if(count==0)
{
x=a[i];
count=1;
}
else if(x==a[i])
{
count++;
}
else
{
count--;
}
}
cout<<x<<endl;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: