如何在不使用内置库的情况下实现字符串单词的循环左移?
嘿,我来帮你搞定这个单词循环左移的实现,完全不用任何内置库,纯手动实现的那种!咱们一步步来拆解逻辑:
核心实现思路
整个流程可以拆成三个关键步骤:手动拆分字符串为单词列表、处理左移逻辑得到新的单词顺序、手动拼接回目标字符串。
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
相关产品推荐
相关产品推荐

