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

如何在不使用内置库的情况下实现字符串单词的循环左移?

嘿,我来帮你搞定这个单词循环左移的实现,完全不用任何内置库,纯手动实现的那种!咱们一步步来拆解逻辑:

核心实现思路

整个流程可以拆成三个关键步骤:手动拆分字符串为单词列表、处理左移逻辑得到新的单词顺序、手动拼接回目标字符串。


1. 手动拆分字符串为单词(含前后空格处理)

因为不能用内置的拆分函数,咱们得自己遍历字符来抠单词,还要注意原字符串的前后空格(看你的例子里原字符串前后有空格,结果也保留了,所以得把这些空格单独存下来):

  • 先提取前缀空格:从字符串开头开始,逐个字符检查,直到遇到非空格字符,把这些连续的空格存起来。
  • 然后提取中间的单词列表:继续遍历剩下的字符,用一个临时变量存当前正在拼接的单词:
    • 遇到非空格字符,就加到临时变量里;
    • 遇到空格时,如果临时变量不为空,就把它加入单词列表,然后清空临时变量;
  • 最后提取后缀空格:遍历到字符串末尾后,把最后剩下的连续空格存起来(注意如果最后一个字符是空格,要把这些都收集);
  • 另外,遍历结束后如果临时变量还有内容(也就是最后一个单词后面没有空格的情况),也要把它加入单词列表。

举个例子,你的原字符串" hi my name is aviv and ":

  • 前缀空格是" ";
  • 单词列表是["hi", "my", "name", "is", "aviv", "and"];
  • 后缀空格是" "。

2. 处理循环左移的逻辑

拿到单词列表后,左移n位的本质就是把前n个单词移到列表的末尾。这里要注意几个边界:

  • 如果单词列表为空,或者n是0,或者n等于单词数量的倍数(比如单词有6个,n=6、12...),那左移后和原列表一样,不用动;
  • 如果n大于单词数量,比如n=8,单词有6个,那其实相当于左移8%6=2位(取模操作,避免重复移动);
  • 最终的新单词列表就是:[第n个单词到最后一个单词] + [第0个到第n-1个单词]

对应你的例子,n=2,单词列表是6个,新列表就是["name", "is", "aviv", "and", "hi", "my"]。


3. 手动拼接回目标字符串

现在要把前缀空格、新单词列表、后缀空格拼起来,同样不能用内置的join函数,得手动拼接:

  • 先把前缀空格放到结果字符串里;
  • 然后遍历新单词列表:
    • 第一个单词直接加进去;
    • 从第二个单词开始,先加一个空格,再加单词;
  • 最后加上后缀空格。

这样就得到了你的例子结果:" name is aviv and hi my "。


示例代码(以Python为例,无任何内置库依赖)
def left_shift_words(original_str, n):
    # 步骤1:提取前缀空格
    prefix_space = ""
    idx = 0
    while idx < len(original_str) and original_str[idx] == " ":
        prefix_space += original_str[idx]
        idx += 1
    
    # 步骤2:提取单词列表
    words = []
    current_word = ""
    while idx < len(original_str):
        if original_str[idx] != " ":
            current_word += original_str[idx]
        else:
            if current_word != "":
                words.append(current_word)
                current_word = ""
        idx += 1
    # 处理最后一个单词(如果后面没有空格)
    if current_word != "":
        words.append(current_word)
    
    # 步骤3:提取后缀空格
    suffix_space = ""
    # 回到字符串末尾往前找
    idx = len(original_str) - 1
    while idx >= 0 and original_str[idx] == " ":
        suffix_space = original_str[idx] + suffix_space
        idx -= 1
    
    # 步骤4:处理左移逻辑
    m = len(words)
    if m == 0 or n % m == 0:
        return original_str
    # 取模得到实际需要左移的位数
    shift = n % m
    new_words = words[shift:] + words[:shift]
    
    # 步骤5:手动拼接结果
    result = prefix_space
    for i in range(len(new_words)):
        if i > 0:
            result += " "
        result += new_words[i]
    result += suffix_space
    
    return result

# 测试你的例子
original = " hi my name is aviv and "
print(left_shift_words(original, 2))  # 输出:" name is aviv and hi my "

边界情况说明
  • 如果原字符串全是空格:直接返回原字符串;
  • 如果只有一个单词:不管左移多少位,结果都是原字符串;
  • 如果n是负数:可以把它转换成右移(比如n=-2,相当于左移m-2位,m是单词数量),你可以在代码里加个判断处理这种情况。

内容的提问来源于stack exchange,提问作者aviv.L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:24:32