每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!_)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)
如果没有小朋友,请返回-1
public class Solution {
public int LastRemaining_Solution(int n, int m) {
int i = -1, j = -1, cnt = n;//用i记忆编号,均从-1开始
boolean[] flag = new boolean[n];
while(cnt > 0){//cnt记录总的需要出圈的人数
i++;
//对i自增进行判断
if(i == n) i = 0;//这里不是i = -1
if(flag[i]) continue;
j++;//j用来记忆实际的叫数,必须得放在后面
if(j == m - 1){
flag[i] = true;
j = -1;//保证j与i一一对应
cnt--;
}
}
return i;//实际最后一次循环,一直等到j == m- 1才出循环,cnt = n, while(cnt > 0)就是删了n次,直到最后一个元素被标记删除
}
}
2.题型可以变成1-n, 1-m,看对应变化,注意以下代码也是可以通过的
public class Solution {
public int LastRemaining_Solution(int n, int m) {
int i = 0, j = 0, cnt =n;
boolean[] flag = new boolean[n +1];
while(cnt > 0){
i++;
if(i == n + 1) i = 1;
if(flag[i] == true) continue;
j++;
if(j == m ){
flag[i] = true;
cnt--;
j = 0;
}
}
return i -1;
}
}
2.趋势科技笔试题
输入:11
输出:7
从1开始,
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
boolean[] flag = new boolean[n + 1];
int cnt = n;
int i = 0, j = 0, k = 1;//注意i =0,因为开头有些特殊,所以默认从0开始
while (cnt > 0) {
i++;//其实依然需要挨个递增
if(i == n + 1) i = 1;
if (flag[i]) continue;
j++;
if (j == k + 1) {
flag[i] = true;
cnt--;
j = 0;
k++;
}
}
System.out.println(i);
}
}