zoukankan      html  css  js  c++  java
  • 九度oj 题目1370:数组中出现次数超过一半的数字

    题目描述:

    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为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

    第一次代码如下
     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <iostream>
     4 #include <algorithm>
     5  
     6 using namespace std;
     7 int n;
     8 int num[100002];
     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 = 0; i < n; i++) {
    20             scanf("%d",&num[i]);
    21         }
    22         qsort(num, n, sizeof(int), cmp);
    23         int cnt = 1;
    24         int pan = n/2;
    25         bool isFind = false;
    26         for(int i = 1; i < n; i++) {
    27             if(num[i] == num[i-1]) {
    28                 cnt++;
    29                 if(cnt > pan) {
    30                     printf("%d
    ",num[i]);
    31                     isFind = true;
    32                     break;
    33                 }
    34             }
    35             else {
    36                 cnt = 1;
    37             }
    38         }
    39         if(!isFind) {
    40             puts("-1");
    41         }
    42     }   
    43     return 0;
    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[100002];
     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 = 0; i < n; i++) {
    20             scanf("%d",&num[i]);
    21         }
    22         qsort(num, n, sizeof(int), cmp);
    23         double cnt = 1;
    24         double pan = n/2;
    25         bool isFind = false;
    26         int ans = num[0];
    27         for(int i = 1; i < n; i++) {
    28             if(num[i] == num[i-1]) {
    29                 cnt++;
    30                 if(cnt > pan) {
    31                     ans = num[i];
    32                     break;
    33                 }
    34             }
    35             else {
    36                 cnt = 1;
    37             }
    38         }
    39         if(cnt > pan) {
    40             printf("%d
    ",ans);
    41         }
    42         else {
    43             puts("-1");
    44         }
    45     }    
    46     return 0;
    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[100002];
     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 = 0; i < n; i++) {
    20             scanf("%d",&num[i]);
    21         }
    22         qsort(num, n, sizeof(int), cmp);
    23         
    24         int pan = n/2;
    25         int cnt = 0;
    26         for(int i = 0; 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
    ",num[pan]);
    36         }
    37         else {
    38             puts("-1");
    39         }
    40     }    
    41     return 0;
    42 }
  • 相关阅读:
    虚拟机vmware的连接方式以及IP端口,协议等概念
    python3爬虫--shell命令的使用和firefox firebug获取目标信息的xpath
    numpy的基本用法
    scrapy模拟请求头
    (1)python Scrapy爬虫框架
    flutter ui
    dart 类
    dart 基础
    黑苹果镜像下载地址
    android9.0请求异常
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5810101.html
Copyright © 2011-2022 走看看