二、超过一半的数字:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字

可以看出6出现的次数超过了数组长度的一半
数组长度为偶数
当出现次数最多的元素恰好全部排在左半区间时,利用快速排序会很难判断

当出现次数较多的元素排列在正中间时,可以利用快速排序,可以返回数组5和6的下标

当出现次数较多的元素全部出现在右半区间时,也很难判断
题目:Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?

可以利用一遍扫描数组解决
水王占总数的一半,说明总数必为偶数;
假设隔一个数就是水王,两两不同最后一定会消为0;
水王也可能为最后一个元素,每次扫描的时候,多一个动作和最后一个元素作比较,单独计数,计数恰好等于一半;计数不够一半,那么去掉最后一个元素,水王就是留下的那个candidate

两两不同,最后消除后为0

package morethanhalf;
import java.util.Arrays;public class Solve {public static void solve4(int[] arr){  int candidate=arr[0];  //候选数int nTimes=0;    //出现的次数int countOfLast=0;  //统计最后这个元素出现的次数int N=arr.length;for(int i=0;i<N;i++) {if(arr[i]==arr[N-1])  //增加和最后一个元素比较的步骤countOfLast++;if(nTimes==0) {candidate=arr[i];nTimes=1;continue;}if(arr[i]==candidate)nTimes++;elsenTimes--;}if(countOfLast==N/2)  //最后一个元素出现的次数System.out.println(arr[N-1]);elseSystem.out.println(candidate);}
public static void main(String[] args) {solve4(new int[] {0,1,2,1,1});
}
}

数组和指针:超过一半的数字;水王发帖相关推荐

  1. 一篇文章告诉你如何寻找水王(数组中存在超过一半的数字)

    #include<iostream> using namespace std; //case1 排序后返回数组中间的那个数字O nlogn //case2 hash统计 //case3 顺 ...

  2. 《剑指offer》-- 复杂链表的复制、字符串的排列、数组中出现次数超过一半的数字、连续子数组的最大和

    一.复杂链表的复制: 参考牛客网的chancy:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba 1 ...

  3. 剑指offer:面试题39. 数组中出现次数超过一半的数字

    题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, ...

  4. 【剑指offer-Java版】29数组中出现次数超过一半的数字

    数组中出现次数超过一半的数字 两种思路: 思路一:由于出现次数超过一半,所以如果对这个数组进行划分之后无论如何,位于数组下标 n/2的数字就是出现次数超过一半的数 所以问题就转换为了求划分一次之后 位 ...

  5. 【剑指Offer】28、数组中出现次数超过一半的数字

      题目描述:   数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.   例如:输入如下所示的一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过 ...

  6. 数据结构与算法-- 数组中出现次数超过一半的数字(时间复杂度的讨论)

    时间效率 互联网想对时间效率格外的敏感,所以我们总是在需求迭代一定程度后去做优化.而且我们解决问题的时候,时间效率往往是一个考查的重点.因此我们平时编码过程中就必须不断的优化效率,追求完美的态度与能力 ...

  7. 牛客题霸 [数组中出现次数超过一半的数字] C++题解/答案

    牛客题霸 [数组中出现次数超过一半的数字] C++题解/答案 题解: 题意很明确 跑一遍for循环,统计每个数出现的大小 然后再跑一边循环,查看是否存在大于一半的情况 注意题目要求是大于,没有等于 代 ...

  8. 【剑指offer】十九,数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  9. 28 数组中出现次数超过一半的数字

    1 //数组中出现次数超过一半的数字 2 //数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}. 由于数字2在数组中出现了 ...

最新文章

  1. 业界 | 微软亚洲研究院携手培生,以人工智能技术赋能个性化学习
  2. Math.ceil(),Math.floor()与Math.round()三个函数的定义。
  3. Android动态方式破解apk进阶篇(IDA调试so源码)
  4. Windows10 【系统周期表】【系统下载表】【大型软件表】
  5. wordpress主题-一款功能强大的综合类型wordpress模板
  6. 使用 uBLAS 进行实对称正定矩阵的 Cholesky 分解
  7. 科比退役原因-数据分析
  8. 必须掌握,二叉树的前中后序遍历(迭代+递归)详细代码
  9. dae怎么用草图大师打开,教你su模型导入lumion的方法
  10. 伯努利试验和二项分布
  11. Wireshark 301: Spying on what people are downloading (Part 2 of 2)
  12. 为啥干不过苹果?某手机老总一语道破心中所想,赚钱才是第一位的
  13. Lasso 的 python实现
  14. 浙大高分子物理郑强教授的激情演讲
  15. maskrcnn-Github-balloon
  16. 文件隐藏服务器版本信息,隐藏版本信息
  17. 《代码整洁之道》—第1章1.4节思想流派
  18. java如何处理tcp异常断开_针对TCP连接异常断开的分析
  19. Ultimaker Cura 4.9.X 开发教程 (零)
  20. 不错的培训机构和课程

热门文章

  1. python和c语言的区别-c语言和python的区别
  2. python可以做什么工作-python都能干什么用
  3. python入门经典代码-Python入门经典
  4. python基础教程3下载-Python基础教程第3版中国PDF电子书免费下载
  5. android语音识别
  6. 语音识别kaldi该如何学习?
  7. 成为一名PHP专家其实并不难
  8. 运筹学常考知识点总结一
  9. element ui 表格滚动条抖动的问题
  10. 正则 文字输入不超过5个汉字或者10个字符