微软笔试题 求出现次数超过一半的元素
2012-07-22 15:18
239 查看
此题为微软面试一百题中的一题。
用动态规划算法可以实现在线性时间内完成任务。
思路就是假设第一个元素就是要找的那个result元素。
最终这个元素出现的次数一定比其他所有元素出现的次数还多。
每次遍历到一个新元素的时候,如果和现在的result相同,就将result的记录个数增加一个;如果不相同,就将result 的记录个数减少一个;如果result的记录个数被减少到了初始的一个,那么就换新的元素当做result,因为两个元素的记录数都为1的时候选谁作为result都不影响。
最终求出result。
代码和结果如下:
用动态规划算法可以实现在线性时间内完成任务。
思路就是假设第一个元素就是要找的那个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;
相关文章推荐
- 笔试算法题(24):找出出现次数超过一半的元素 & 二叉树最近公共父节点
- 数组中超过出现次数一半的数字 【微软面试100题 第七十四题】
- 找出出现次数超过数组一半元素的数
- 微软等数据结构+算法面试100题(23)--数组中超过出现次数超过一半的数字
- 剑指Offer-29-java实现查找数组中出现次数超过一半的元素
- 数组中超过出现次数一半的数字 【微软面试100题 第七十四题】
- 广联达笔试,找整形数组中出现次数超过n/2的元素
- Java实现 找出数组中出现次数超过数组长度一半的元素
- 获取数组中出现次数超过一半的元素
- 找出一个数组中出现次数超过一半的元素
- 二叉树的最近公共祖先、两个最远节点、第K层结点个数、出现次数超过一半的元素
- 找出数组中出现次数超过一半或者超过1/3的元素
- O(NlogN)复杂度选取出现次数超过一半的元素(递归版本)
- 寻找数组中出现次数超过一半的元素
- 找出数组中出现次数超过一半的元素
- 利用容器完成“数组中出现次数超过一半的数字”笔试题
- 【IT笔试面试题整理】数组中出现次数超过一半的数字
- 求数组中出现次数超过一半的元素
- 查找数组中出现次数超过一半的元素
- 腾讯2016测试开发岗笔试题--数组中出现次数超过一半的数字