思路简单,关键点在于:不论使用何种数据类型,都要注意删除的方式——删除之后所有数据前移一位,这样可能会导致你想删除的数据不在原本的位置。
所以本次采用在一轮遍历中先全部记录要淘汰的人的编号,然后统一淘汰。
import java.util.*;
public class csp_17_12_02 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int k = in.nextInt();
in.close();
int number =1;
//ArrayList<Integer> list = new ArrayList();
Map<Integer,Integer> map = new HashMap<>();
for(int i=1;i<=n;i++) {
// list.add(i);
map.put(i, i);
}
while(n>1) {
int person = n;
//遍历现在的人数
Map<Integer,Integer> tempmap = new HashMap<>();
for(Map.Entry<Integer, Integer> T :map.entrySet()) {
if(contain(number,k)) {
int j = T.getKey();
tempmap.put(j, j);
//System.out.println("记录:"+j+" "+number);
}
number++;
}
//System.out.print(tempmap);
int p =1;
if(tempmap.size()>0)
for(Map.Entry<Integer, Integer> T :tempmap.entrySet()) {
int t = T.getKey();
//System.out.print("移除:"+t+" "+map.get(t));
map.remove(t);
p++;
person--;
if(person==1) {
break;
}
}
//System.out.println();
n = person;
}
for(Map.Entry<Integer, Integer> T :map.entrySet()) {
System.out.print(T.getKey());
}
//System.out.print(list.get(1));
}
public static boolean contain(int number,int k) {
char[] c = (number+"").toCharArray();
if(Character.getNumericValue(c[c.length-1])==k || number%k==0) {
return true;
}
return false;
}
}