请实现字符串右循环移位函数,比如:”abcdefgh”循环右移两位就是”ghabcdef”.
实现字符串循环移位可有多种方式:
老实方法:一个一个的移位,每次循环,先把最后一个保存起来,然后从后面开始往后挪一位。(如果移位K次,这个操作就进行K次循环) 图示内部移位一次流程:代码如下:
void RightLoopMove(char *pStr, unsigned short k) { int len = strlen(pStr); assert((*pStr)&&(k)); short steps = k%len; for (size_t i = 0; i < steps; i++) { char tmp = pStr[len-1]; for (size_t j = len-1; j >0; j--) { pStr[j] = pStr[j-1]; } pStr[0] = tmp; } } int main() { char msg[] = "abcdefghi"; RightLoopMove(msg, 2); printf("%s", msg); system("pause"); return 0; }2.写一个翻转字符串函数 实现三次翻转; 观察字符串循环移位K次的结果,与字符串后K位翻转一次,前面的翻转一次,然后整体翻转后得到的结果相同。 图示如下:
代码如下:
void myHswap(char *pStr, int left, int right) //写一个翻转函数 { assert(*pStr); //判断合法性 while (left < right) { char tmp = pStr[right]; //交换左右数组字符,定义一个tmp,把最右边的值给tmp pStr[right] = pStr[left]; pStr[left] = tmp; left++; right--; } } void RightLoopMove(char *pStr, unsigned short K) { int len = strlen(pStr); int steps = K%len; assert(*pStr); myHswap(pStr, 0, len - steps - 1); //经过三次翻转得到所要的结果 myHswap(pStr, len-steps, len -1); myHswap(pStr, 0, len - 1); } int main() { char msg[] = "abcdefghi"; RightLoopMove(msg,13 ); printf("%s", msg); system("pause"); return 0; }