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

代码中StringBuilder存在什么问题?字符串交替合并功能异常排查

交替合并字符串代码的StringBuilder逻辑错误分析

问题背景

给定两个字符串word1和word2,需按交替顺序合并(以word1开头),若某字符串更长,将剩余部分追加到合并结果末尾。编写的Java代码如下:

class Solution {
    public String mergeAlternately(String word1, String word2) {
        int length = word1.length() + word2.length();
        StringBuilder ans = new StringBuilder(length);
        int left = 0, right = 0, current = 0;
        System.out.println(ans.length());
        while(current < ans.length()) {
            System.out.println("called");
            if(left >= word1.length()) {
                ans.append(word2.charAt(right));
                right++;
            }
            else if(right >= word2.length()) {
                ans.append(word2.charAt(left));
                left++;
            }
            else if(current % 2 == 0) {
                ans.append(word1.charAt(left));
                left++;
            }
            else {
                ans.append(word2.charAt(right));
                right++;
            }
            current++;
        }
        return ans.toString();
    }
}

测试输入:word1 = "abc", word2 = "pqr",预期输出为"apbqcr",但实际输出为空字符串,需排查代码中StringBuilder相关逻辑问题。


核心问题

1. StringBuilder循环条件完全错误

你用StringBuilder(int length)初始化时,传入的数值是内部缓冲区的初始容量,不是当前字符串的长度。刚创建的StringBuilder是空的,ans.length()返回0,导致current < ans.length()(即0 < 0)不成立,循环根本没有执行,直接返回空字符串。

2. 附带的字符追加错误

当right >= word2.length()(即word2已遍历完)时,代码错误地调用ans.append(word2.charAt(left)),这里应该追加word1的剩余字符,即word1.charAt(left)。


修正方案

方案一:保留原交替逻辑(按current奇偶控制顺序)

class Solution {
    public String mergeAlternately(String word1, String word2) {
        int totalLength = word1.length() + word2.length();
        StringBuilder ans = new StringBuilder(totalLength);
        int left = 0, right = 0, current = 0;
        
        // 循环条件改为遍历总长度次数,而非StringBuilder当前长度
        while(current < totalLength) {
            if(left >= word1.length()) {
                ans.append(word2.charAt(right));
                right++;
            }
            else if(right >= word2.length()) {
                // 修正为追加word1的剩余字符
                ans.append(word1.charAt(left));
                left++;
            }
            else if(current % 2 == 0) {
                ans.append(word1.charAt(left));
                left++;
            }
            else {
                ans.append(word2.charAt(right));
                right++;
            }
            current++;
        }
        return ans.toString();
    }
}

方案二:更简洁的交替追加逻辑

直接循环直到两个字符串都遍历完毕,依次追加各自的字符:

class Solution {
    public String mergeAlternately(String word1, String word2) {
        int totalLength = word1.length() + word2.length();
        StringBuilder ans = new StringBuilder(totalLength);
        int left = 0, right = 0;
        
        while (left < word1.length() || right < word2.length()) {
            if (left < word1.length()) {
                ans.append(word1.charAt(left++));
            }
            if (right < word2.length()) {
                ans.append(word2.charAt(right++));
            }
        }
        return ans.toString();
    }
}

关键说明

  • StringBuilder的length()方法返回的是当前已存储的字符数量,初始为空时为0;而构造方法传入的参数只是设置缓冲区初始容量,用于优化性能,不代表当前字符长度。
  • 处理剩余字符时,要明确区分哪个字符串还有未遍历的字符,避免追加错误的内容。

内容的提问来源于stack exchange,提问作者21SCS34 Arumugaperumal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:15:32