题目描述:

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

输入:

每个测试案例包括2行:

第一行输入一个整数n(1<=n<=100000),表示数组中元素的个数。

第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,1000000000]。

输出:

对应每个测试案例,输出出现的次数超过数组长度的一半的数,如果没有输出-1。

样例输入:
  1. 9
  2. 1 2 3 2 2 2 5 4 2
样例输出:
  1. 2
  2.  
  3. 第一次代码如下
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <iostream>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7. int n;
  8. int num[];
  9.  
  10. int cmp(const void *a, const void *b) {
  11. int at = *(int *)a;
  12. int bt = *(int *)b;;
  13. return at - bt;
  14. }
  15. int main(int argc, char const *argv[])
  16. {
  17. //freopen("input.txt","r",stdin);
  18. while(scanf("%d",&n) != EOF) {
  19. for(int i = ; i < n; i++) {
  20. scanf("%d",&num[i]);
  21. }
  22. qsort(num, n, sizeof(int), cmp);
  23. int cnt = ;
  24. int pan = n/;
  25. bool isFind = false;
  26. for(int i = ; i < n; i++) {
  27. if(num[i] == num[i-]) {
  28. cnt++;
  29. if(cnt > pan) {
  30. printf("%d\n",num[i]);
  31. isFind = true;
  32. break;
  33. }
  34. }
  35. else {
  36. cnt = ;
  37. }
  38. }
  39. if(!isFind) {
  40. puts("-1");
  41. }
  42. }
  43. return ;
  44. }

没有考虑到n == 1时情况,出错

修改如下

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <iostream>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7. int n;
  8. int num[];
  9.  
  10. int cmp(const void *a, const void *b) {
  11. int at = *(int *)a;
  12. int bt = *(int *)b;;
  13. return at > bt;
  14. }
  15. int main(int argc, char const *argv[])
  16. {
  17. //freopen("input.txt","r",stdin);
  18. while(scanf("%d",&n) != EOF) {
  19. for(int i = ; i < n; i++) {
  20. scanf("%d",&num[i]);
  21. }
  22. qsort(num, n, sizeof(int), cmp);
  23. double cnt = ;
  24. double pan = n/;
  25. bool isFind = false;
  26. int ans = num[];
  27. for(int i = ; i < n; i++) {
  28. if(num[i] == num[i-]) {
  29. cnt++;
  30. if(cnt > pan) {
  31. ans = num[i];
  32. break;
  33. }
  34. }
  35. else {
  36. cnt = ;
  37. }
  38. }
  39. if(cnt > pan) {
  40. printf("%d\n",ans);
  41. }
  42. else {
  43. puts("-1");
  44. }
  45. }
  46. return ;
  47. }

由于超过一半,所以如果存在这样的数,排好序后num[n/2]就是该数

本来以为下面代码会更快,没想到居然变慢了

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <iostream>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7. int n;
  8. int num[];
  9.  
  10. int cmp(const void *a, const void *b) {
  11. int at = *(int *)a;
  12. int bt = *(int *)b;;
  13. return at > bt;
  14. }
  15. int main(int argc, char const *argv[])
  16. {
  17. //freopen("input.txt","r",stdin);
  18. while(scanf("%d",&n) != EOF) {
  19. for(int i = ; i < n; i++) {
  20. scanf("%d",&num[i]);
  21. }
  22. qsort(num, n, sizeof(int), cmp);
  23.  
  24. int pan = n/;
  25. int cnt = ;
  26. for(int i = ; i < n; i++) {
  27. if(num[i] == num[pan]) {
  28. cnt++;
  29. if(cnt > pan) {
  30. break;
  31. }
  32. }
  33. }
  34. if(cnt > pan) {
  35. printf("%d\n",num[pan]);
  36. }
  37. else {
  38. puts("-1");
  39. }
  40. }
  41. return ;
  42. }

九度oj 题目1370:数组中出现次数超过一半的数字的更多相关文章

  1. 剑指Offer - 九度1370 - 数组中出现次数超过一半的数字

    剑指Offer - 九度1370 - 数组中出现次数超过一半的数字2013-11-23 03:55 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组 ...

  2. 九度OJ 1370 数组中出现次数超过一半的数字

    题目地址:http://ac.jobdu.com/problem.php?pid=1370 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2 ...

  3. 《剑指offer》第三十九题(数组中出现次数超过一半的数字)

    // 面试题39:数组中出现次数超过一半的数字 // 题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例 // 如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, ...

  4. Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)

    剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...

  5. 力扣 - 剑指 Offer 39. 数组中出现次数超过一半的数字

    题目 剑指 Offer 39. 数组中出现次数超过一半的数字 思路1(排序) 因为题目说一定会存在超过数组长度一半的一个数字,所以我们将数组排序后,位于length/2位置的一定是众数 代码 clas ...

  6. 数组中出现次数超过一半的数字 -java

    数组中出现次数超过一半的数字 -java 方法一: 数组排序,然后中间值肯定是要查找的值. 排序最小的时间复杂度(快速排序)O(NlogN),加上遍历. 方法二: 使用散列表的方式,也就是统计每个数组 ...

  7. 《剑指offer》— JavaScript(28)数组中出现次数超过一半的数字

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

  8. 剑指Offer:数组中出现次数超过一半的数字【39】

    剑指Offer:数组中出现次数超过一半的数字[39] 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于这 ...

  9. 编程算法 - 数组中出现次数超过一半的数字 代码(C)

    数组中出现次数超过一半的数字 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 数组中有一个数字出现的次数超过数组长度的一半, 请找出这个数字. ...

  10. php实现求数组中出现次数超过一半的数字(isset($arr[$val]))(取不同数看剩)(排序取中)

    php实现求数组中出现次数超过一半的数字(isset($arr[$val]))(取不同数看剩)(排序取中) 一.总结 1.if(isset($arr[$val])) $arr[$val]++; //1 ...

随机推荐

  1. shell脚本安装nginx

    #!/bin/bash N_url="http://nginx.org/download/nginx-1.8.0.tar.gz" N_pack=`echo $N_url|awk - ...

  2. python爬虫之路——无头浏览器初识及简单例子

    from selenium import webdriver url='https://www.jianshu.com/p/a64529b4ccf3' def get_info(url): inclu ...

  3. UVA 11732 strcmp() Anyone (Trie+链表)

    先两两比较,比较次数是两者相同的最长前缀长度*2+1,比较特殊的情况是两者完全相同时候比较次数是单词长度*2+2, 两个单词'末尾\0'和'\0'比较一次,s尾部'\0'和循环内'\0'比较一次. 因 ...

  4. HDU 5094 Maze (状压)

    加一个维度,钥匙的状态,状压一下.n很小,钥匙也只有10个,bfs就好了. 忘了数组初始化.以后坚决不犯这种低级错误. #include<cstdio> #include<queue ...

  5. UVA11212 EditingaBook ( IDA*搜索)

    首先说说IDS,就DFS限定一个层数上限maxd,如果在maxd范围内没有找到解,就增加maxd,继续搜索. 当访问到当前结点u时,估计还要搜索h(u)层,如果h(u)+当前层数d>maxd的时 ...

  6. Django form组件应用

    form 组件的使用 class Register(forms.Form): user = forms.CharField(min_length=2, widget=widgets.TextInput ...

  7. Python 继承实现的原理(继承顺序)

    继承顺序 Python3 : 新式类的查找顺序:广度优先 新式类的继承: class A(object): Python2 3 都是了 MRO算法--生成一个列表保存继承顺序表 不找到底部 Pytho ...

  8. kubernetes-平台日志收集(ELK)

    使用ELK Stack收集Kubernetes平台中日志与可视化 K8S系统的组件日志 K8S Cluster里面部署的应用程序日志 日志系统: ELK安装 安装jdk [root@localhost ...

  9. 安装python3.6 pip3 flake8

    apt-get install python3-pip # Python3 ➜  ~ pip3 -V                                             pip 9 ...

  10. VMware vSphere6.0 服务器虚拟化部署安装图解

    一 VMware vSphere部署的前期规划要点 1 vSphere的优点 (略) 2 如何利用现在的设备架构虚拟化环境 在虚拟化过程中,用户大多会考虑目前现有的服务器.存储.交换机等基础设备是否可 ...