字符串循环右移算法
碰到一些问题,需要对字符串进行循环右移几位的操作,如果一位一位的整体移动,时间就耗费太多了;而如果使用辅助数组来临时存储一下,那么空间耗费就大了。想了有点时间,找到一个O(n)时间,仅需两个临时字符变量的方法。适合较长字符串,较多移动间距的循环移位操作:
/* 字符串循环右移函数:
tmp1存储前一个, tmp2 存储下一个。start记录起始位置设置它的原因是:如果某次循环之后正好回到了start,那么令 start++, cur再指向它,从这个新位置开始循环移动。
*/
void MoveRight2(char* s, int len, int k) { //k 表示右移多少位
void MoveRight2(char* s, int len, int k) { //k 表示右移多少位
k = k%len;
if (k == 0) return;
if (k == 0) return;
int i, cnt = 0;
int cur = 0, start = 0, next;
char tmp1 = s[0], tmp2;
char tmp1 = s[0], tmp2;
while (cnt < len) {
next = (cur+k)%len;
tmp2 = s[next];
s[next] = tmp1;
if(++cnt == len) break;
if (next == start) {
cur = ++start;
tmp1 = s[cur];
}
else {
tmp1 = tmp2;
cur = next;
}
}
}