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

如何仅旋转数组中特定元素?实现首尾固定的字符串 scrambler

解决字符串Scrambler的问题:保留首尾,旋转中间字符

我明白你要做的事——给字符串做个“中间旋转”,只动第二个到倒数第二个的字符,首尾不动,比如把"string"变成"srintg"。你现在用Collections.rotate()没得到预期结果,问题出在这几个地方:

  1. 拆分方式错了:你用word.split(" ")是按空格拆分字符串,不是把每个字符拆成列表元素!如果输入是"string",这会得到一个只有["string"]的列表,旋转后还是它自己;看你说实际输出是"rintgs",估计你可能写成了split("")(按空字符拆分),但就算是这样——
  2. 你旋转了整个字符串:没有把首尾字符单独拎出来,直接旋转整个字符列表,自然会把第一个字符也卷进去,导致结果变成首尾都动的情况。

正确的实现思路

核心就是把首尾字符和中间部分分开处理:

  • 先判断字符串长度,如果≤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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:57:33