喊三出局 选做
有100人 围成1圈,从1到3依次报数
数到3的就淘汰,最后留下两人,问剩下的是谁?
public class shuSanTaoTai {
public static void main(String[] args) {
int[] num = new int[100];
for (int i = 0; i < num.length; i++) {
num[i] = i + 1;
}
hanSanChuJu(num);
}
public static void hanSanChuJu(int[] num) {
// 创建变量cuont作下标 length为剩余人数
int count = 0;
int length = num.length;
// 当length <= 2时循环终止
while (length > 2) {
// 当count = 0时默认喊1
// 一次++喊2
count++;
//判断是否到最后一个人
//到最后一个人时 count等于0时喊2,所以将if放入第一个count++后面,使count等于 1 时喊三
if (count==length) {
count = 0;
}
// 二次++喊3
count++;
//当最后一个人喊2 时, 第0位喊3, 所以将if放入第二个count++后面, 使count等于0时喊三
if (count==length) {
count = 0;
}
//防止下标越界 i <num.length - 1
//当喊3时 之后所有值前移一位
for (int i = count; i < num.length - 1; i++) {
num[i] = num[i + 1];
}
length --;
//当最后一个人喊3 时, 第0位喊1 , 所以将if放入循环结束, 使count等于0时喊1
if (count==length) {
count = 0;
}
}
System.out.println(num[0]);
System.out.println(num[1]);
}
}
代码优化:
喊三出局能不能改为喊n出局
注: 代码中有好多重复语句可以优化
public class shuSanTaoTai {
public static void main(String[] args) {
int[] num = new int[10];
for (int i = 0; i < num.length; i++) {
num[i] = i + 1;
}
//入参数中 第二个值为几即为喊几出局
hanSanChuJu(num,5);
}
public static void hanSanChuJu(int[] num,int n) {
// 创建变量cuont作下标 length为剩余人数
int count = 0;
int length = num.length;
// 当length <= n-1时循环终止
while (length > n-1) {
for (int i = 0; i < n-1; i++) {
count++;
if (count==length) {
count = 0;
}
}
for (int i = count; i < num.length - 1; i++) {
num[i] = num[i + 1];
}
length --;
if (count==length) {
count = 0;
}
}
for (int i = 0; i < n-1; i++) {
System.out.println(num[i]);
}
}
}
将前面重复的语句放到一个for循环里面去
输出语句也用for循环代替