您的位置:首页 > 职场人生

微软笔试题 求出现次数超过一半的元素

2012-07-22 15:18 239 查看
此题为微软面试一百题中的一题。
用动态规划算法可以实现在线性时间内完成任务。
思路就是假设第一个元素就是要找的那个result元素。
最终这个元素出现的次数一定比其他所有元素出现的次数还多。
每次遍历到一个新元素的时候,如果和现在的result相同,就将result的记录个数增加一个;如果不相同,就将result 的记录个数减少一个;如果result的记录个数被减少到了初始的一个,那么就换新的元素当做result,因为两个元素的记录数都为1的时候选谁作为result都不影响。
最终求出result。

代码和结果如下:

timer t;
int a[]={1,2,1,3,1,8,1,2,3,1,4,9,1,1,0,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};
vector<int> va(a,a+sizeof(a)/sizeof(int));
print(va.begin(),va.end());
cout<<"array size : "<<va.size()<<endl;
int count_more=1;
int result=va[0];
for (vector<int>::size_type i=1;i<va.size();i++)
{
if (a[i]==result)
{
++count_more;
}
else if (count_more==1)
{
result=a[i];
}
else
{
--count_more;
}
}
cout<<"more than half is : "<<result<<endl
<<count_more<<endl
<<"number of "<<result<<" is "<<count(va.begin(),va.end(),result)<<endl;
cout<<"time elapsed "<<t.elapsed()<<endl;


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