代码中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
相关产品推荐
相关产品推荐

