龙通科技面试题之:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,再从他的下一个人重新报数,最后留下的是原来第几号的那位

dudi123456 2019-06-13 11:33:35

4、有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,再从他的下一个人重新报数,问最后留下的是原来第几号的那位?
public class Test {
public static void main(String[] args) {
int peo;
System.out.println("请输入人数:");
Scanner inp = new Scanner(System.in);
peo = inp.nextInt();
int k = Keeper(peo, 3);
System.out.println("最后留下的是 " + k + " 号!");
}
public static int Keeper(int peo, int n) {
int k = 0;
int[] array = new int[peo];
for (int i = 1; i < peo; i++) {
int j = 1;
while (j <= n) {
if ( 1 ) {
j--;
}
if (j == n) {
2
}
j++;
3
}
}
for (k = 0; k < peo; k++) {
if (array[k] == 0) {
4
}
}
return k + 1;
}
}
...全文
657 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
dudi123456 2019-06-14
  • 打赏
  • 举报
回复
引用 2 楼 Gxh-csdn 的回复:
用LinkedList五行代码。
哈哈,那是,因为用那个可以直接删除出圈的人嘛!主要因为题目是用的数组的,要填空,哈哈
cryings 2019-06-14
  • 打赏
  • 举报
回复
约瑟夫问题,经典的数据结构与算法
dudi123456 2019-06-13
  • 打赏
  • 举报
回复

package hashMap;

import java.util.Scanner;

public class C {

	// 4、有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),
	// 凡报到3的人退出圈子,再从他的下一个人重新报数,问最后留下的是原来第几号的那位?
	public static void main(String[] args) {
		int peo;
		// System.out.println("请输入人数:");
		// Scanner inp = new Scanner(System.in);
		// peo = inp.nextInt();
		int k = Keeper(14, 3);// 2
		System.out.println("最后留下的是 " + k + " 号!");
	}

	public static int Keeper(int peo, int n) {
		int k = 0;
		int[] array = new int[peo];
		for (int i = 1; i <= peo;) {// 只循环一遍?
			int j = 1;
			while (j <= n) {
				if (array[i - 1] == 1) {
					j--;
				}
				if (j == n) {
					array[i - 1] = 1;// 出圈人的位置置为0
					k++;// 已出圈人数+1
					printArray(array);
				}
				j++;
				// 思路如下:
				// 1.已出圈人数是否是还剩一个人?
				// 2.如果是就把i置为可以跳出外层循环的peo+1(外层循环的条件为:i <= peo)
				// 3.否则,判断i(数组下标)的值:是到了数组末尾吗?
				// 4.是:把i的值重新置为1;不让外层循环结束,继续循环
				// 5.否:i的值+1,继续数数
				i = k == peo - 1 ? peo + 1 : (i == peo ? 1 : i + 1);// 在这里回头和出外层循环
			}
		}
		for (k = 0; k < peo; k++) {
			if (array[k] == 0) {// 其他全部置为1了
				break;
			}
		}
		return k + 1;
	}

	private static void printArray(int[] array) {
		System.out.println("当前数组情况:");
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + "  ");
		}
		System.out.println("*********************************");
	}

}

其中这一句代码,非常精妙:i = k == peo - 1 ? peo + 1 : (i == peo ? 1 : i + 1);// 在这里回头和出外层循环
「已注销」 2019-06-13
  • 打赏
  • 举报
回复
用LinkedList五行代码。

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧