字符串循环右移
解法:根据题意,编写的函数能把字符串循环右移n位。例如字符串“abcdefghi”,如果n=2,移位后是“hiabcdefg”。
(1)先翻转前段“gfedcba hi”,
(2)再翻转后段“gfedcba ih”
(3)最后翻转整个“hi abcdefg”,得到想要的结果。
下面是c语言的指针操作代码(略改动):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reserve(char *p, char *q)
{
while(p < q)
{
*p ^= *q; //利用异或运算得到两字符交换
*q ^= *p;
*p ^= *q;
p++;
q--;
}
}
void loopMove(char *str, int steps)
{
if (str == NULL || steps > strlen(str) || steps < 0) {
printf("Fail to loop move.\n");
return;
}
char *p = str;
int len = strlen(str);
char *q = p + len - 1 - steps;
reserve(p, q); //先翻转前一段
p = q + 1;
q = str + len - 1;
reserve(p, q); //翻转后一段
p = str;
reserve(p, q); //翻转整个字符串
}
int main()
{
char str[] = "123456789";
int steps = 0;
printf("string: %s\n", str);
printf("input step: ");
scanf("%d", &steps);
loopMove(str, steps);
printf("after loopMove %d: %s\n", steps, str);
return 0;
}
转自:http://blog.csdn.net/shiren_bod/article/details/6610956(略作改动)