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

Java实现句子5字母以上单词反转时部分单词丢失问题求解

问题原因

  • 循环边界逻辑错误:spinWords方法中的for循环每次迭代都会重新计算当前sentence的单词数,而你每处理一个单词就会截掉sentence的第一个单词,wordCount(sentence)的返回值会持续变小,导致循环实际执行次数远小于初始句子的总单词数,直接造成后面的单词被遗漏。
  • 最后一个单词处理逻辑缺失:你每次通过sentence.indexOf(' ')获取第一个空格的位置来切割单词,当处理到最后一个单词时,sentence中已经没有空格,indexOf(' ')会返回-1,此时调用substring(0, -1)会直接抛出字符串索引越界异常,就算没有触发异常,最后一个单词也不会被正常处理。
  • 循环次数冗余:就算你用初始单词数作为固定边界,i <= 单词数的写法也会多执行一次循环,会导致多余的空字符串处理。

修复方案

建议先把原句子按空格切割成固定的单词数组,再遍历数组处理每个单词,逻辑会清晰很多,修复后的参考代码如下:

public static String spinWords(String sentence) {
    // 先把句子按空格切割成单词数组,固定长度不会变
    String[] words = sentence.split(" ");
    StringBuilder ans = new StringBuilder();
    for (int i = 0; i < words.length; i++) {
        String word = words[i];
        if (word.length() >=5) {
            ans.append(reverseString(word));
        } else {
            ans.append(word);
        }
        // 除了最后一个单词,其他后面加空格
        if (i != words.length -1) {
            ans.append(" ");
        }
    }
    return ans.toString();
}

如果你要保留原来的切割逻辑,也可以先计算初始单词数作为固定循环边界,再单独处理最后一个单词:

public static String spinWords(String sentence) {
    String ans = "";
    // 先拿到初始的总单词数,作为固定循环边界
    int totalWord = wordCount(sentence);
    // 循环次数是总单词数减1,留最后一个单词单独处理
    for(int i = 0; i < totalWord - 1; i++) {
        int spaceIndex = sentence.indexOf(' ');
        String word = sentence.substring(0, spaceIndex);
        if(word.length() >= 5) {
            ans += reverseString(word) + " ";
        } else {
            ans += word + " ";
        }
        sentence = sentence.substring(spaceIndex + 1);
    }
    // 处理最后一个单词
    ans += sentence.length() >=5 ? reverseString(sentence) : sentence;
    return ans;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:36:03