题目描述:

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

输入:

每个测试案例包括2行:

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

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

输出:

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

样例输入:
9
1 2 3 2 2 2 5 4 2
样例输出:
2

第一次代码如下
 #include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm> using namespace std;
int n;
int num[]; int cmp(const void *a, const void *b) {
int at = *(int *)a;
int bt = *(int *)b;;
return at - bt;
}
int main(int argc, char const *argv[])
{
//freopen("input.txt","r",stdin);
while(scanf("%d",&n) != EOF) {
for(int i = ; i < n; i++) {
scanf("%d",&num[i]);
}
qsort(num, n, sizeof(int), cmp);
int cnt = ;
int pan = n/;
bool isFind = false;
for(int i = ; i < n; i++) {
if(num[i] == num[i-]) {
cnt++;
if(cnt > pan) {
printf("%d\n",num[i]);
isFind = true;
break;
}
}
else {
cnt = ;
}
}
if(!isFind) {
puts("-1");
}
}
return ;
}

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

修改如下

 #include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm> using namespace std;
int n;
int num[]; int cmp(const void *a, const void *b) {
int at = *(int *)a;
int bt = *(int *)b;;
return at > bt;
}
int main(int argc, char const *argv[])
{
//freopen("input.txt","r",stdin);
while(scanf("%d",&n) != EOF) {
for(int i = ; i < n; i++) {
scanf("%d",&num[i]);
}
qsort(num, n, sizeof(int), cmp);
double cnt = ;
double pan = n/;
bool isFind = false;
int ans = num[];
for(int i = ; i < n; i++) {
if(num[i] == num[i-]) {
cnt++;
if(cnt > pan) {
ans = num[i];
break;
}
}
else {
cnt = ;
}
}
if(cnt > pan) {
printf("%d\n",ans);
}
else {
puts("-1");
}
}
return ;
}

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

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

 #include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm> using namespace std;
int n;
int num[]; int cmp(const void *a, const void *b) {
int at = *(int *)a;
int bt = *(int *)b;;
return at > bt;
}
int main(int argc, char const *argv[])
{
//freopen("input.txt","r",stdin);
while(scanf("%d",&n) != EOF) {
for(int i = ; i < n; i++) {
scanf("%d",&num[i]);
}
qsort(num, n, sizeof(int), cmp); int pan = n/;
int cnt = ;
for(int i = ; i < n; i++) {
if(num[i] == num[pan]) {
cnt++;
if(cnt > pan) {
break;
}
}
}
if(cnt > pan) {
printf("%d\n",num[pan]);
}
else {
puts("-1");
}
}
return ;
}

九度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. COGS 2815. 天黑请闭眼

    ★   输入文件:jos.in   输出文件:jos.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 天亮了,请大家睁眼 昨晚是,平安夜. 处于集会中心的村民们大多数都 ...

  2. 【Python图像特征的音乐序列生成】一个更科学的图片分类参考方法,以及一个看起来很好用的数据集

    数据集地址:http://www.imageemotion.org/ 论文地址:http://www.doc88.com/p-1905670442096.html

  3. PostgreSQL扫盲教程

    在这个链接下载PostgreSQL. 安装时,请记住您给user postgres设置的初始密码,以及默认端口号5432,后面需要使用. 再安装图形化管理UI pgadmin,可以从这个链接获得. 安 ...

  4. CodeForces 77C Beavermuncher-0xFF (树形dp)

    不错的树形dp.一个结点能走多次,树形的最大特点是到达后继的路径是唯一的,那个如果一个结点无法往子结点走,那么子结点就不用考虑了. 有的结点不能走完它的子结点,而有的可能走完他的子节点以后还会剩下一些 ...

  5. 使用Timer组件制作左右飘动的窗体

    实现效果: 知识运用: Form类的Left和Top属性 实现代码: private void timer1_Tick(object sender, EventArgs e) { Rectangle ...

  6. Problem C: 查找最大元素

    Problem C: 查找最大元素 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 786  Solved: 377[Submit][Status][Web ...

  7. 《队长说得队》【Alpha】Scrum meeting 5

    项目 内容 这个作业属于哪个课程 >>2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 >>实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 ...

  8. Bootstrap历练实例:带列表组的面板

    带列表组的面板 我们可以在任何面板中包含列表组,通过在 <div> 元素中添加 .panel 和 .panel-default 类来创建面板,并在面板中添加列表组.您可以从 列表组 一章中 ...

  9. 协议(Protocol)与委托代理(Delegate)

    协议(Protocol)的作用: 1. 规范接口,用来定义一套公用的接口: 2. 约束或筛选对象. 代理(Delegate): 它本身是一种设计模式,委托一个对象<遵守协议>去做某件事情, ...

  10. TypeError: Cannot read property 'tap' of undefined

    E:\vue-project\vue-element-admin-master>npm run build:prod vue-element-admin@3.8.1 build:prod E:\ ...