如何仅旋转数组中特定元素?实现首尾固定的字符串 scrambler
解决字符串Scrambler的问题:保留首尾,旋转中间字符
我明白你要做的事——给字符串做个“中间旋转”,只动第二个到倒数第二个的字符,首尾不动,比如把"string"变成"srintg"。你现在用Collections.rotate()没得到预期结果,问题出在这几个地方:
- 拆分方式错了:你用
word.split(" ")是按空格拆分字符串,不是把每个字符拆成列表元素!如果输入是"string",这会得到一个只有["string"]的列表,旋转后还是它自己;看你说实际输出是"rintgs",估计你可能写成了split("")(按空字符拆分),但就算是这样—— - 你旋转了整个字符串:没有把首尾字符单独拎出来,直接旋转整个字符列表,自然会把第一个字符也卷进去,导致结果变成首尾都动的情况。
正确的实现思路
核心就是把首尾字符和中间部分分开处理:
- 先判断字符串长度,如果≤2,直接返回原字符串(没中间字符可转)
- 提取第一个、最后一个字符,以及中间的子串
- 只对中间子串的字符列表做旋转
- 最后把三部分拼起来
完整代码示例
import java.util.Arrays; import java.util.Collections; import java.util.List; public class StringScrambler { public static String scramble(String word) { // 短字符串直接返回,不用处理 if (word.length() <= 2) { return word; } // 拆分出首尾和中间部分 char first = word.charAt(0); char last = word.charAt(word.length() - 1); String middlePart = word.substring(1, word.length() - 1); // 把中间部分转成字符列表,执行旋转 List<String> middleChars = Arrays.asList(middlePart.split("")); // rotate(-1)表示左移一位,对应你例子里的需求:"trin" → "rint" Collections.rotate(middleChars, -1); // 拼接成最终字符串 return first + String.join("", middleChars) + last; } public static void main(String[] args) { System.out.println(scramble("string")); // 输出:srintg } }
关键细节解释
substring(1, word.length()-1):这个方法的结束索引是开区间,所以刚好能拿到从第二个字符到倒数第二个字符的中间部分,比如"string"会拿到"trin"Collections.rotate(middleChars, -1):负数表示向左旋转,每个字符左移一位,第一个中间字符会移到末尾。如果想向右旋转,就传正数(比如rotate(1)会把"trin"变成"ntri")- 边界处理:避免字符串长度不足时调用
charAt或substring出现索引越界异常
内容的提问来源于stack exchange,提问作者Ryan Chng
相关产品推荐
相关产品推荐

