Java字符串区间反转代码无报错但未生效,请求问题排查
字符串区间反转代码问题排查与修复
问题背景
给定字符串my_string和二维数组queries,queries的每个元素为[s,e],表示将my_string中索引从s到e的部分反转,按queries的顺序处理后返回结果。示例输入:
- my_string:
"rermgorpsam" - queries:
[[2, 3], [0, 7], [5, 9], [6, 10]]
预期结果:"programmers"
编写的Java代码无语法错误,但运行后始终返回原字符串,需排查问题。
错误代码
import java.util.*; class Solution { public String solution(String my_string, int[][] queries) { char[] charArr = my_string.toCharArray(); for (int s = 0; s < queries.length; s++) { for (int e = 0; e < queries[s].length; e++) { reverse(charArr, queries[s][0], queries[s][1]); } } String answer = String.valueOf(charArr); return answer; } static void reverse(char[] arr, int s, int e) { char[] copy = Arrays.copyOfRange(arr, s, e); for (int i = 0; i < copy.length; i++) { arr[s + i] = copy[copy.length - (i + 1)]; } } }
问题分析
- 重复执行反转操作:外层循环遍历每个查询时,额外添加了内层循环遍历查询的两个元素(
s和e),导致每个[s,e]区间被反转两次。两次反转会抵消修改效果,相当于没有执行反转。 - 数组拷贝范围错误:
Arrays.copyOfRange(arr, s, e)的第二个参数是不包含的结束索引,而题目中e是需要包含的区间终点,因此应该使用Arrays.copyOfRange(arr, s, e+1),否则会遗漏e位置的字符,导致反转不完整。 - 反转逻辑冗余:额外拷贝数组的做法效率较低,直接在原数组上交换首尾元素即可完成反转。
修复后的代码
import java.util.*; class Solution { public String solution(String my_string, int[][] queries) { char[] charArr = my_string.toCharArray(); // 遍历每个查询,去掉多余的内层循环 for (int[] query : queries) { int s = query[0]; int e = query[1]; reverse(charArr, s, e); } return String.valueOf(charArr); } static void reverse(char[] arr, int s, int e) { // 原地反转,无需额外拷贝数组 while (s < e) { char temp = arr[s]; arr[s] = arr[e]; arr[e] = temp; s++; e--; } } }
代码说明
- 移除了多余的内层循环,每个查询只执行一次反转操作。
- 修改反转逻辑为原地交换:通过双指针从区间首尾向中间交换元素,避免额外数组开销,同时确保区间内所有元素都被正确反转。
- 彻底解决了原代码中两次反转抵消、拷贝范围错误的问题,运行后可得到预期结果。
内容的提问来源于stack exchange,提问作者hehexd
相关产品推荐
相关产品推荐

