PAT 1124 Raffle for Weibo Followers

版权声明:如若转载,请联系作者。 https://blog.csdn.net/liu16659/article/details/86532198

PAT 1124 Raffle for Weibo Followers Java

1.题意

输入:数字m,n,s,一串人名。
第s个为获奖的人,则s+n 为下一个获奖的人,如果此人已经获奖,那么则往后顺移一位。
输出:获奖人的名单。【按照获奖的顺序】

2.分析

使用 LinkedHashSet 保存获奖人的名单,这样不仅可以去重,而且可以保持顺序。

3.样例输入

9 3 2
Imgonnawin!
PickMe
PickMeMeMeee
LookHere
Imgonnawin!
TryAgainAgain
TryAgainAgain
Imgonnawin!
TryAgainAgain



9 3 2
Imgonnawin!
PickMe
PickMeMeMeee
TryAgainAgain
TryAgainAgain
TryAgainAgain
TryAgainAgain
TryAgainAgain


2 3 5
Imgonnawin!
PickMe

10 3 2
Imgonnawin!
PickMe
PickMeMeMeee
TryAgainAgain
TryAgainAgain
TryAgainAgain
TryAgainAgain
TryAgainAgain
TryAgainAgain
Imgonnawin!

4.代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.*;

public class P1124 {
    public static void main(String[] args) throws IOException {
        Reader.init(System.in);
        int n = Reader.nextInt();
        int skip = Reader.nextInt();
        int first = Reader.nextInt();
        int i = 0;
        List<String> name = new LinkedList<>();
        String str;
        //System.out.println("n = "+ n+",skip = "+skip+", first = "+first);
        //String winner[] = new String[N];
        Set<String> winner = new LinkedHashSet<>();
        for(i = 0;i < n;i++) {
            str = Reader.next();
            name.add(str);
        }

        int count = 1;// 用于计数是否skip 了
        if (first > n) {
            System.out.println("Keep going...");
            System.exit(0);
        }
        winner.add(name.get(first - 1));//首先将第一个获奖的人添加进去
        for(i = first;i < name.size();i++) {
            //如果轮到了,但是之前没有数据
            if (count%skip == 0 && (!winner.contains(name.get(i)))) {
                winner.add(name.get(i));
                count = 0;//reset 0
            }
            //如果轮到了,但是之前有数据
            else if (count%skip == 0 && (winner.contains(name.get(i)))) {
                String temp = name.get(i);//表示该name已经获奖
                while (name.get(i).equals(temp) && i < name.size() - 1) {//重复找到下一个没有获奖的人
                    i++;
                }
                winner.add(name.get(i));//添加下一个名单
                count = 0;//reset 0
            }
            count++;
        }
        for (String s : winner) {
            System.out.println(s);
        }
    }
}


class Reader {
    static BufferedReader reader;
    static StringTokenizer tokenizer;

    /** call this method to initialize reader for InputStream */
    static void init(InputStream input) throws IOException {
        reader = new BufferedReader(new InputStreamReader(input) );
        tokenizer = new StringTokenizer("");
        //这里初始化tokenizer只是为了进入下面的while()循环,而不是别的原因。
        //那么还有优化的空间么?
    }

    /** get next word */
    static String next() throws IOException {
        while ( ! tokenizer.hasMoreTokens() ) {//如果后面还有数据,则直接返回
            //TODO add check for eof if necessary
            tokenizer = new StringTokenizer(reader.readLine() );//否则,读取下一行
        }
        return tokenizer.nextToken();
    }

    static int nextInt() throws IOException {
        return Integer.parseInt( next() );
    }

    static double nextDouble() throws IOException {
        return Double.parseDouble( next() );
    }

    //获取字符 => 因为 next()方法返回的是一个String
    static char nextChar() throws IOException {
        return next().charAt(0);
    }
}

5.执行结果

在这里插入图片描述

6.主要坑点

  • 可能不仅仅是顺移一位,可能会顺延到最后一个,但是都没有找到不重复的获奖的人

猜你喜欢

转载自blog.csdn.net/liu16659/article/details/86532198
今日推荐