问题描述:将一个字符串左旋n个字符
例如“abcd”左旋俩个字符得到“cdab”
法一:暴力循环法
左旋几个就循环几次
第一次循环,先将首字符a存放在临时变量中,然后将bcd分别向前移动一位,最后将a补加到字符串末尾;以此类推
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>#include<string.h>
void leftround(char* arr, int n)
{int i, j;int len = strlen(arr);int times = n % len;//对于长度为4的字符串,左旋5个字符就相当于左旋1个字符!!!for (i = 0; i < n; i++)//左旋n次就循环n次{char ret = arr[0];//先将第一个字符保存好,防止被覆盖了for (j = 0; j < len - 1; j++){arr[j] = arr[j + 1];//向前移动一个字符}arr[j] = ret;//循环出来时,j恰好是左后一个元素的下标}
}
int main()
{char arr[] = "abcde";int n;scanf("%d", &n);leftround(arr, n);printf("%s", arr);return 0;
}
法二:库函数实现法
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>#include<string.h>
void leftround(char* arr, int n)
{int len = strlen(arr);int pos = n % len;//前后断开的位置char tem[10];strcpy(tem, arr + pos);//先把后面的拷贝过去strncat(tem, arr, pos * sizeof(arr[0]));strcpy(arr, tem);
}
int main()
{char arr[] = "abcde";int n;scanf("%d", &n);leftround(arr, n);printf("%s", arr);return 0;
}
法三:三次反转法
对于abcde,左旋3个字符
首先将abc倒转,其次将de倒转,这两步得到了cbaed
最后将整个数组倒转得到deabc
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>#include<string.h>
void reverse(char*arr,int left, int right)
{while (left < right){char ret = arr[left];arr[left] = arr[right];arr[right] = ret;left++;right--;}
}
int main()
{char arr[] = "abcde";int n;scanf("%d", &n);int len = strlen(arr);int pos = n % len;reverse(arr, 0, pos - 1);reverse(arr, pos, len - 1);reverse(arr, 0, len - 1);printf("%s", arr);return 0;
}