• WOJ-1203


    Description

    有一组数,很多很多个数,里面有一个数出现了超过一半次,请你把它找出来

    Input

    先是一个N (N<=1000000),然后接下来一行N个数,请一直处理到EOF.

    Output

    对每个Case,输出一行,这一行只含有一个在之前数列中出现超过一半次的数.

    Sample Input

    115 5 5 5 5 5 1 2 3 4 6

    Sample Output

    5

    思路:1.可以排序,将所有数据存在一个数组中,并将其排序,取出其中间一个数就是出现频率超过一半的数,时间复杂度为O(nlogn);

              2.在网上看到的一个新思路,因为这个数字出现超过半数,所以设置一个变量vote,即投票数,超半数的投票数减去其他数的出现次数肯定大于0,所以使用两个变量candidate和vote,分别代表候选人和票数,假设第一个输入的数字为首个候选者,

    按如下方式投票和更换候选人:

    若当前数与候选人一样,则把候选人的票数加1

    若当前数与候选人不一样, 则把它的票数减1,如果减掉后票数小于0,则把候选人踢掉,用当前数作为新的候选人

    最后剩下的候选人就是出现次数超过一半的数。

    此思路引自:http://kenby.iteye.com/blog/1031114​。

    附上利用思路2写的代码:

    #include

    #include

    int main(){

    int N;

    int candidate;

    int ans;

    int vote;

    int temp;

    while (scanf_s("%d", &N) != EOF){

    if (N == 1 || N == 2){

    scanf_s("%d", &ans);

    }

    else {

    int i;

    scanf_s("%d", &candidate);

    vote = 1;

    for (i = 0; i < N - 1; i++){

    scanf_s("%d", &temp);

    if (temp == candidate){

    vote++;

    }

    else vote--;

    if (vote == 0){

    candidate = temp;

    vote = 1;

    }

    }

    ans = candidate;

    }

    printf("%d", ans);

    }

    }

  • 相关阅读:
    facesconfig详解 Crazy
    java反射学习之一反射机制概述
    axis2开发webservice程序
    java反射学习之二万能EXCEL导出
    JMF框架
    解决FF浏览器无法执行window.close()脚本
    ava:String和Date、Timestamp之间的转换
    java获取当前路径。
    JSP 动态验证码。
    dojo.mixin
  • 原文地址:https://www.cnblogs.com/wangyuqin/p/6099207.html
Copyright © 2020-2023  润新知