Ignatius and the Princess IV (ACM练习题)

2 篇文章 0 订阅


"OK, you are not too bad, em... But you can never pass the next test." feng5166 says. 

"I will tell you an odd number N, and then N integers. There will be a special integer among them, you have to tell me which integer is the special one after I tell you all the integers." feng5166 says. 

"But what is the characteristic of the special integer?" Ignatius asks. 

"The integer will appear at least (N+1)/2 times. If you can't find the right integer, I will kill the Princess, and you will be my dinner, too. Hahahaha....." feng5166 says. 

Can you find the special integer for Ignatius? 
InputThe input contains several test cases. Each test case contains two lines. The first line consists of an odd integer N(1<=N<=999999) which indicate the number of the integers feng5166 will tell our hero. The second line contains the N integers. The input is terminated by the end of file. 
OutputFor each test case, you have to output only one line which contains the special number you have found. 
Sample Input
5
1 3 2 3 3
11
1 1 1 1 1 5 5 5 5 5 5
7
1 1 1 1 1 1 1
Sample Output
3
5
1

题目链接:https://vjudge.net/contest/225380#problem/B

题目大致意思为,给你N个数,你需要找出出现次数 >= (N+1)/2的数。由于出现次数以过半,所以这个数肯定只有一个,也是唯一的一个。

我的解题思路,遍历所有的数,找出出现次数最多的数(由于输入的测试用例肯定会有出现次数符合要求的数,所以不考虑不符合要求的输入情况,直接找出现次数最大的)。从右往左扫描,先把第一个扫描的值赋值给result变量,计数变量count为1 。继续扫描,如果当前扫描的值不为result,则count--,如果相等,则count++,如果count为0,则把当前扫描的值赋值给result,count++。扫描结束时,result中保存的值则为答案。 

注意:由于输入数据组数较多,输入读取数据时一定要快,推荐用StreamTokenizer这种读取方法。

该方法事件复杂度为n,空间复杂度忽略不计。AC用时400ms


附上参考代码:

package acm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

/**
 * Ignatius
 * create by chenshihang on 2018/5/2
 */

public class Ignatius {
    public static void main(String[] args) throws IOException {
        StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        while(in.nextToken()!=StreamTokenizer.TT_EOF){
            int N = (int)in.nval;
            int count = 0;
            int result = 0;
            for(int i=0;i<N;i++){
                in.nextToken();
                int a=(int)in.nval;
                if(i==0){
                    count++;
                    result=a;
                }else{
                    if(count==0){
                        result=a;
                        count++;
                    }else {
                        if(a==result){
                            count++;
                        }else {
                            count--;
                        }
                    }
                }

            }
            System.out.println(result);

        }
    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值