关于JAVA-选队长游戏训练任务的学习过程
在学习Java数组的过程中,遇到了下面这个有趣的题目。自己想的代码花了挺久没有跑成功,所以想记录下心得体会。
题目为:
今天同学们相约一起爬山游玩,为了更好的进行这场活动,大家准备推举
一个人作为出游的临时队长。为了体现合理公平,大家提出了一个比较有趣的 规则。所有人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数), 凡报到 3 的人退出圈子,剩下的人继续报数,最后留下的当选为队长。
请你通过编写程序,求出一组人中的队长是原来第几位同学。
原代码(有瑕疵):
package day03_test1;
import java.util.Scanner;
public class Java_10101006 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner (System.in);
System.out.println("请输入人数:");
int n = input.nextInt();
int[] nums = new int[n];
int counter=0; //用来从1数到3
int countSkip=0; //记录退出的人数
int i=0;
int captain=0;//队长的序号
while(countSkip<n-1) {
if (nums[i]==0) {
counter++;
i++;
}
if(counter==3) {
nums[i]=-1;
countSkip++;
counter=0;
}
if(i==n-countSkip-1) {
i=0;
}
}
for(i=0;i<n;i++) {
if (nums[i]==0){
captain = i+1;
break;
}
}
System.out.println("这组人中的队长是原来第"+captain+"位同学");
}
}
要注意的问题:
- 需要用for loop对数组动态赋初始值:
for(int i = 0; i < nums.length; i ++) {
`nums[i] = 1;//给数组都初始化为1`
}
- 个人逻辑是,不断地循环数组,直到countSkip达到(队伍人数-1),意思是只剩最后一个人,即队长。源代码的3个if没加循环。
经过老师指导后,给下面的代码外层加了for loop:
for(int i=0;i<n;i++) {
`if(nums[i] != 3) { // 跳过报数为3的人(已被淘汰)`
`if(counter > 3) {`
`counter = 1; // 重新开始报数`
`}`
`nums[i] = counter++; //继续数`
`if(nums[i]==3) {`
`countSkip++; // 统计当前队列中报数为3的总人数`
`}else {`
`captain = i+1; // 更新最后一个淘汰的人,原下标+1`
`}`
`}`
}
- break的位置问题,需要退出多重循环。
更改后的代码:
package day03_test1;
import java.util.Scanner;
public class Java_10101006 {
`public static void main(String[] args) {`
`// TODO Auto-generated method stub`
`Scanner input = new Scanner (System.in);`
`System.out.println("请输入人数:");`
`int n = input.nextInt();`
`int[] nums = new int[n];`
`//对数组动态赋值`
`for(int i = 0; i < nums.length; i ++) {`
`nums[i] = 1;//给数组都初始化为1`
`}`
`int counter=1; //用来从1数到3`
`int countSkip=0; //记录退出的人数`
`int captain=0;//队长的序号`
`while(countSkip<n-1) {`
`for(int i=0;i<n;i++) {`
`if(nums[i] != 3) { // 跳过报数为3的人(已被淘汰)`
`if(counter > 3) { `
`counter = 1; // 重新开始报数`
`}`
`nums[i] = counter++; //继续数`
`if(nums[i]==3) {`
`countSkip++; // 统计当前队列中报数为3的总人数`
`}else {`
`captain = i+1; // 更新最后一个淘汰的人,原下标+1`
`}`
`}`
`}`
`}`
`System.out.println("这组人中的队长是原来第"+captain+"位同学"); `
`}`
}
相关文章
- 基于-SLF4J-MDC-机制的日志链路追踪配置属性
ums: # ================ 基于 SLF4J MDC 机制的日志链路追踪配置属性 ================ mdc: # 是否支持基于 SLF4J MDC
- ajax-跨域访问
ajax 跨域访问 <!DOCTYPE html> <html xmlns:th="http://www.w3.org/1999/xhtml"> <head>
- 给第三方登录时用的数据库表-user_connection-与-auth_token-添加-redis-cache
spring: # 设置缓存为 Redis cache: type: redis # redis redis: host: 192.168.88.88 port
- Java动态代理
Jdk动态代理 通过InvocationHandler和Proxy针对实现了接口的类进行动态代理,即必须有相应的接口 应用 public class TestProxy { public
- Java读取classpath中的文件
public void init() { try { //URL url = Thread.currentThread().getContextClassLo
随机推荐
- 基于-SLF4J-MDC-机制的日志链路追踪配置属性
ums: # ================ 基于 SLF4J MDC 机制的日志链路追踪配置属性 ================ mdc: # 是否支持基于 SLF4J MDC
- ajax-跨域访问
ajax 跨域访问 <!DOCTYPE html> <html xmlns:th="http://www.w3.org/1999/xhtml"> <head>
- 给第三方登录时用的数据库表-user_connection-与-auth_token-添加-redis-cache
spring: # 设置缓存为 Redis cache: type: redis # redis redis: host: 192.168.88.88 port
- Java动态代理
Jdk动态代理 通过InvocationHandler和Proxy针对实现了接口的类进行动态代理,即必须有相应的接口 应用 public class TestProxy { public
- Java读取classpath中的文件
public void init() { try { //URL url = Thread.currentThread().getContextClassLo