package com.test03;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
/**
* n人站圈报数,3 出列。 最后留下的是原来的第几个 3种方式。
*
* @author pys
*
*/
public class Count {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入总人数:");
int n = scanner.nextInt(); // 输入总人数
int count = 0; // 判断数到3的。
// 初始化链表,把每个位置作为值加进链表。
List list = new LinkedList();//移除比ArrayList更快
for (int i = 1; i <= n; i++) {
list.add(i);
}
// 链表方式1
while (list.size() > 1) {
for (int i = 0; i < list.size(); i++) {
count++;
if (count == 3) {
System.out.println(" " + list.get(i) + "号出局");
list.remove(i);
count = 1; // remove后后一个值取代了原来的值
}
}
}
//链表方式2
for (int i = 0; i < n - 1; i++) {//只留一个 循环n-1次
count = (count + 2) % list.size();
// remove后后一个值取代了原来的值,+2就是下一个3
System.out.println(" " + list.get(count) + "号出局");
list.remove(count);
}
System.out.println("留下人的位置是原来的" + list.get(0) + "号。");
//数组方式 全设为1 出局设为0
int[] a = new int[n];
int count = 0;
int allCount = n;
for (int i = 0; i < a.length; i++) {
a[i] = 1;
}
while (allCount != 1) {
for(int i = 0; i < a.length; i++) {
if (a[i] == 1) {
count++;
if (count == 3) {
System.out.println((i + 1) + "号出局");
count = 0;
a[i] = 0;
allCount--;
}
}
}
for (int j = 0; j < a.length; j++) {
if (a[j] == 1)
System.out.println("留下人的位置是原来的" + (j + 1) + "号。");
}
}
}
第二种和第一种差不多 比第一种快一点
第三种更好理解
面试时用第二种逼格更高一点 代码更短小精悍