题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报道3的人退出圈子,问最后留下的是原来第几号的那位
输入:一行,一个正整数n(1<=n<=1000000)
输出:输出答案示例:
输入:5
输出:4出局的编号依次是3,1,5,2,最后留下的是4
技巧:并不是真正删除,而是通过0,1去标记,如果物理删除,再循环,时间复杂度会很高
import java.util.Scanner;
public class Tran2 {
public static void main(String[] args) {
int count = 0; // 去掉人的数量
int index = 1; // 所有人的索引,不管走没走
int jsq = 0; // 用于报数
int n = 0; // 总人数
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
int[] a = new int[n + 10];
while(true) {
if(a[index] == 0) { // 0代表有人
jsq++; // 报数
if(jsq == 3) { // 报到3,去掉这个人,标记为1,逻辑删除
a[index] = 1;
count++;
if(count == n) { // 最后一个去掉的人,就是留下的人
System.out.println(index);
break;
}
jsq = 0;
}
}
index++;
if(index > n) { // n个人围成一圈
index = 1;
}
}
}
}
欢迎大家一起交流!Java全套学习资料的电子版,免费分享给大家,关注我的公众号,菜单栏–>技术相关–>免费资源即可领取,还有网课查答案,包括学习通、智慧树、mooc,内容涵盖计算机、政治等等,还有其他免费资源(简历模板、电子版书籍和考试资料等等),说不准大家会有用(分享干货)!
扫码加关注吧!