1. 问题定义与场景解析
字符串旋转操作是编程面试中的经典题型,尤其在算法笔试和面试中频繁出现。右旋字符串问题要求我们将字符串末尾的k个字符移动到字符串开头,这种操作在实际开发中有着广泛的应用场景。
比如在文本编辑器中的环形缓冲区实现、密码学中的简单加密算法、游戏开发中的角色名称动态展示等场景都会用到类似的字符串旋转操作。这个问题看似简单,但能很好地考察面试者对字符串操作、边界条件处理以及算法优化的理解。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础解法与实现思路
2.1 暴力解法分析
最直观的解法是创建一个新字符串,先复制原字符串的后k个字符,再复制前n-k个字符。这种方法时间复杂度为O(n),空间复杂度也是O(n),因为需要额外的存储空间。
python复制def right_rotate_string(s, k):
n = len(s)
if n == 0:
return s
k = k % n # 处理k大于字符串长度的情况
return s[-k:] + s[:-k]
注意:这里必须处理k大于字符串长度的情况,通过取模运算确保k在合理范围内。
2.2 原地操作优化思路
虽然暴力解法简单易懂,但在内存受限的场景下,我们可能需要考虑原地操作的方法。可以通过三次反转实现原地旋转:
- 反转整个字符串
- 反转前k个字符
- 反转剩下的字符
这种方法的时间复杂度仍然是O(n),但空间复杂度降为O(1),因为只需要常数级别的额外空间。
python复制def reverse(s, l, r):
while l < r:
s[l], s[r] = s[r], s[l]
l += 1
r -= 1
def right_rotate_inplace(s, k):
s = list(s) # Python中字符串不可变,先转为列表
n = len(s)
if n == 0:
return ''.join(s)
k = k % n
reverse(s, 0, n-1)
reverse(s, 0, k-1)
reverse(s, k, n-1)
re
