一本通1186 出现次数超过一半的数(类似桶排序)

【题目描述】

给出一个含有n(0 < n ≤ 1000)个整数的数组,请找出其中出现次数超过一半的数。数组中的数大于-50且小于50。

【输入】

第一行包含一个整数n,表示数组大小;

第二行包含n个整数,分别是数组中的每个元素,相邻两个元素之间用单个空格隔开。

【输出】

如果存在这样的数,输出这个数;否则输出no。

【输入样例】

3
1 2 2

【输出样例】

2

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
int a[n],f[101]={};//根据取值范围定义101数组
for(int i=0;i<n;i++)
{
cin>>a[i];//输入数值
f[a[i]+50]++;//桶排序的精髓,对应数的桶里个数加1。这里有一个细节,就是我加了50,因为每个数的数据范围在-50到50之间,但是整型数组是没有负数号的,所以我加50存下来
}
for(int i=0;i<n;i++)
{
if(f[a[i]+50]>n/2)//如果这个数超过一半,则输出,并结束
{
cout<<a[i];
return 0;
}
}
cout<<"no";//如果没有结束,就输出“no”
return 0;
}

原文地址:https://www.cnblogs.com/57xmz/p/12590339.html

时间: 2024-10-13 18:53:19

一本通1186 出现次数超过一半的数(类似桶排序)的相关文章

1186:出现次数超过一半的数

传送门:http://ybt.ssoier.cn:8088/problem_show.php?pid=1186 1186:出现次数超过一半的数 时间限制: 1000 ms         内存限制: 65536 KB提交数: 5616     通过数: 2614 [题目描述] 给出一个含有n(0 < n ≤ 1000)个整数的数组,请找出其中出现次数超过一半的数.数组中的数大于-50且小于50. [输入] 第一行包含一个整数n,表示数组大小: 第二行包含n个整数,分别是数组中的每个元素,相邻两个

28:出现次数超过一半的数

描述 给出一个含有n(0 < n <= 1000)个整数的数组,请找出其中出现次数超过一半的数. 数组中的数大于-50且小于50. 输入 第一行包含一个整数n,表示数组大小:第二行包含n个整数,分别是数组中的每个元素,相邻两个元素之间用单个空格隔开. 输出 如果存在这样的数,输出这个数:否则输出no. 样例输入 3 1 2 2 样例输出 2 来源 习题(13-6) 代码 1 #include<cstdio> 2 #include<string> 3 #include&l

Openjudge 1.13-28:出现次数超过一半的数

总时间限制:  1000ms 内存限制:  65536kB 描述 给出一个含有n(0 < n <= 1000)个整数的数组,请找出其中出现次数超过一半的数. 数组中的数大于-50且小于50. 输入 第一行包含一个整数n,表示数组大小:第二行包含n个整数,分别是数组中的每个元素,相邻两个元素之间用单个空格隔开. 输出 如果存在这样的数,输出这个数:否则输出no. 样例输入 3 1 2 2 样例输出 2还是一道水题,特水..发出来就是证明我还活着.. #include <iostream&g

程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】

转!http://blog.csdn.net/dabusideqiang/article/details/38271661 11.求旋转数组的最小数字 题目:输入一个排好序的数组的一个旋转,输出旋转数组的最小元素. 分析:数组的旋转:把一个数组最开始的若干个元素搬到数组的末尾.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N).但这个思路没有利用输入数组

数组中出现次数超过一半的数

思想:这种题目一般都会要求o(n)的时间复杂度和o(1)的空间,目的就是为了不让你使用HashMap来统计计算.这里我们可以采用两两消除的思想去实现,例如一个数组arr为:1 2 2 3 2 1 2,那么我们把第一个元素arr[0]当作开始的元素k,它的出现次数count赋值为1,然后从第二个元素arr[1]开始往后遍历数组,如果arr[1] == k ,那么我们就把count++,如果不等于,我们就count--,如果count减为0了,那么重新把当前的元素arr[i]赋值给k,count重新

剑指offer——面试题29:数组中出现次数超过一半的数

题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 输入: 每个测试案例包括2行: 第一行输入一个整数n(1<=n<=100000),表示数组中元素的个数. 第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,1000000000]. 输出: 对应每个测试案例,输出出现的次数超过数组长度的一半的数,如果没有输出-1. 解法一:基

算法笔记_131:出现次数超过一半的数(Java)

目录 1 问题描述 2 解决方案 2.1 每次删除两个不同的数 2.2 记录两个值   1 问题描述 数组中有一个数出现的次数超过了数组长度的一半,请找出这个数. 2 解决方案 2.1 每次删除两个不同的数 具体代码如下: package com.liuzhen.practice; public class Main { public int getResult(int[] A) { //找到两个不相等的元素,将这两个元素变为0 for(int start = 0, i = 1;i < A.le

剑指offer系列54---数组中出现次数超过一半的数

[题目]数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. * 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}. * 由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. * [思路]首先取第一个数,之后的数与其比较.相同次数+1:不同次数-1.次数=0的时候将第一个数改为次数保存并将次数设置为1. * 这里要考虑到如果出现次数最多的数字没有达到一半的话,就返回0: 1 package com.exe11.offer; 2 3 /**

经典面试题-数组中出现次数超过一半的数

[题意]:数组中有一个数字出现超过半数以上,找出这个数字. [解析]:一个数字超过半数以上,这是本题仅有的条件,所以,我们要从这个条件入手. 数字超过半数有什么特性呢?首先这个数字肯定是这些数的中位数.所以可以排序,然后找中位数. 但是时间复杂度为排序的O(n*logn),还可以再快吗? 现在有这么一个思路,我们知道,要求的这个数超过半数,那么两个不同的数我们消除,相同的累加, 最后一定能剩下那个超过半数的数字. 具体操作:用一个变量用来存当前剩下的数字,用一个变量做计数器.每次比较数字是否相同