关于JAVA-选队长游戏训练任务的学习过程

技术文档网 2021-04-25

在学习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+"位同学"); }

}

要注意的问题:

  1. 需要用for loop对数组动态赋初始值:

for(int i = 0; i < nums.length; i ++) {

 `nums[i] = 1;//给数组都初始化为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`

     `}`

   `}`

}

  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+"位同学");    `
`}`

}

相关文章

  1. 基于-SLF4J-MDC-机制的日志链路追踪配置属性

    ums: # ================ 基于 SLF4J MDC 机制的日志链路追踪配置属性 ================ mdc: # 是否支持基于 SLF4J MDC

  2. ajax-跨域访问

    ajax 跨域访问 &lt;!DOCTYPE html&gt; &lt;html xmlns:th="http://www.w3.org/1999/xhtml"&gt; &lt;head&gt;

  3. 给第三方登录时用的数据库表-user_connection-与-auth_token-添加-redis-cache

    spring: # 设置缓存为 Redis cache: type: redis # redis redis: host: 192.168.88.88 port

  4. Java动态代理

    Jdk动态代理 通过InvocationHandler和Proxy针对实现了接口的类进行动态代理,即必须有相应的接口 应用 public class TestProxy { public

  5. Java读取classpath中的文件

    public void init() { try { //URL url = Thread.currentThread().getContextClassLo

随机推荐

  1. 基于-SLF4J-MDC-机制的日志链路追踪配置属性

    ums: # ================ 基于 SLF4J MDC 机制的日志链路追踪配置属性 ================ mdc: # 是否支持基于 SLF4J MDC

  2. ajax-跨域访问

    ajax 跨域访问 &lt;!DOCTYPE html&gt; &lt;html xmlns:th="http://www.w3.org/1999/xhtml"&gt; &lt;head&gt;

  3. 给第三方登录时用的数据库表-user_connection-与-auth_token-添加-redis-cache

    spring: # 设置缓存为 Redis cache: type: redis # redis redis: host: 192.168.88.88 port

  4. Java动态代理

    Jdk动态代理 通过InvocationHandler和Proxy针对实现了接口的类进行动态代理,即必须有相应的接口 应用 public class TestProxy { public

  5. Java读取classpath中的文件

    public void init() { try { //URL url = Thread.currentThread().getContextClassLo