版权声明:如若转载,请联系作者。 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.主要坑点
- 可能不仅仅是顺移一位,可能会顺延到最后一个,但是都没有找到不重复的获奖的人