1. 右旋字符串算法解析
右旋字符串是一种常见的字符串操作,它的核心思想是将字符串末尾的k个字符移动到字符串开头。比如将"abcdefg"右旋3位会变成"efgabcd"。这个操作在密码学、数据压缩和文本处理等领域都有广泛应用。
1.1 基础实现思路
最直观的实现方法就是题目中给出的方案:
- 计算字符串长度n
- 输出从第k+1个字符到末尾的子串
- 再输出前k个字符
这种方法的优势在于:
- 时间复杂度O(n),只需要遍历字符串两次
- 空间复杂度O(1),不需要额外存储空间
- 实现简单直观,适合笔试场景
但这种方法有个潜在问题:当k大于字符串长度n时,直接使用k会导致越界访问。正确的做法是先对k取模运算,即k = k % n。
1.2 代码实现详解
让我们仔细分析题目给出的C++实现:
cpp复制#include<bits/stdc++.h>
using namespace std;
int n,k;
char s[10010];
int main() {
scanf("%d",&k);
scanf(" %s",s+1);
n=strlen(s+1);
k=n-k;
for(int i=k+1;i<=n;i++) {
printf("%c",s[i]);
}
for(int i=1;i<=k;i++) {
printf("%c",s[i]);
}
printf("\n");
return 0;
}
这段代码有几个值得注意的点:
- 使用
s+1作为字符串起始位置,这是一种常见的1-based索引习惯 - 实际计算的是左旋n-k位,而非直接右旋k位
- 使用字符数组而非string类,可能是出于效率考虑
提示:在实际工程中,建议使用标准库的string类而非字符数组,这样更安全且功能更丰富。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法优化与变种
2.1 更优雅的实现方式
我们可以用C++标准库提供更简洁的实现:
cpp复制#include <iostream>
#inc
