You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java程序陷入无限循环求助:字符串指定位置循环打印逻辑排查

Java程序无限循环问题排查与修复

问题根源分析

你的代码陷入无限循环主要有两个核心逻辑错误:

  1. N的倍数计算错误:你用n+=n让当前n翻倍,这不是按初始N的倍数递增。比如初始n=2、字符串长度5时,n会变成4→3→1→2,从此进入循环,永远到不了5,触发无限循环。
  2. 循环终止条件不合理:while(n!=l)的条件太苛刻,很多场景下n永远不会等于字符串长度l,导致循环无法终止。

另外,代码还遗漏了初始n等于l的场景,此时应该直接打印最后一个字符。

修正后的代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        int initialN = sc.nextInt(); // 保存初始的N值
        int l = str.length();
        int currentPos = initialN; // 当前要打印的位置(从1开始)
        
        // 用数组记录已打印的位置,避免重复循环(当N和l有公约数时会重复)
        boolean[] visited = new boolean[l];
        
        while (!visited[currentPos - 1]) {
            visited[currentPos - 1] = true;
            System.out.print(str.charAt(currentPos - 1));
            
            // 按初始N递增,超出长度则循环到开头
            currentPos += initialN;
            if (currentPos > l) {
                currentPos -= l;
            }
        }
    }
}

修正说明

  • 保存初始的N值,每次递增都基于这个初始值,保证是N的倍数(循环遍历下的等效倍数)。
  • 使用visited数组记录已打印位置,避免当N和字符串长度l存在公约数时,出现重复循环无法终止的情况(比如l=4、N=2,位置2→4→2→4...)。
  • 循环条件改为判断当前位置是否已访问过,确保所有符合要求的字符都打印一次后终止。

内容的提问来源于stack exchange,提问作者Nive

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:10:52