一、 关于左旋转与右旋转操作:
定义字符串的左旋转操作:把字符串前面的几个字符移动到字符串后面去,比如"ABCDEFGHI",左旋转2位得到"CDEFGHIAB";
同样右旋转操作:把字符串后面的几个字符移动到字符串前面去,比如“ABCDEFGHI”右旋转2位得到“HIABCDEFG”;
二、对于左旋转的实现
void reverse(char *left, char *right)
{
assert((left != NULL)&&(right != NULL));
while(left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void LeftLoopMove(char *pStr, unsigned short steps)
{
int len = strlen(pStr);
assert(pStr);
reverse(pStr, pStr+steps-1); //逆序前半部分
reverse(pStr+steps, pStr+len-1); //逆序后半部分
reverse(pStr, pStr+len-1); //整体逆序
}
int main()
{
char arr[] = "abcdefghi";
LeftLoopMove(arr,2);
printf("%s\n", arr);
return 0;
}
三、对于右旋转的实现:
void reverse(char *left, char *right)
{
assert((left != NULL)&&(right != NULL));
while(left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void RightLoopMove(char *pStr, unsigned short steps)
{
int len = strlen(pStr);
assert(pStr);
reverse(pStr, pStr+len-1); //整体逆序
reverse(pStr, pStr+steps-1); //逆序前半部分
reverse(pStr+steps, pStr+len-1); //逆序后半部分
}
int main()
{
char arr[] = "abcdefghi";
RightLoopMove(arr,2);
printf("%s\n", arr);
return 0;
}
四、图片解析旋转原理
五、在《程序员编程艺术》这本书中有详细的各种解法,可以参考