目录
牛客网JZ58 左旋转字符串,做题链接:
左旋转字符串_牛客题霸_牛客网 (nowcoder.com)
1.循环实现字符串左旋转
方法1:
字符串"abcXYZdef",左旋3个字符。
大致思路:分三步,每一步将一个字符左旋
左旋一个字符的过程如下:
这是将一个字符左旋的过程,将n个字符左旋就是进行循环n次即可
注:在示例2中,输入的字符串为"aab",长度为3,但需要旋转的字符为10,超出了字符串的长度,所以在左旋字符串操作之前,应该先判断输入的左旋个数与字符串长度的关系,如果输入大于字符串长度,应该先进行输入%字符串操作,10%3 = 1,所以最终左旋的个数为1,实现如下:
#include<stdio.h>
#include<string.h>
char* LeftRotateString(char* str, int n) {
int len = strlen(str);
//当n大于字符串长度时,左移的位数为n%len
if (len != 0)
{
if (n > len)
n = n % len;
char* ret = str;
int i = 0;
for (i = 0; i < n; i++)
{
char tmp = *str;
//printf("%c\n",tmp);
//移动一个字符
int j = 0;
for (j = 0; j < len - 1; j++)
{
str[j] = str[j + 1];
}
str[j] = tmp;
}
return ret;
}
else {
return str;
}
}
int main()
{
char arr[100] = { 0 };
scanf("%s", arr);
int n = 0;
scanf("%d", &n);
char* ret = LeftRotateString(arr, n);
printf("%s\n", ret);
return 0;
}
示例1:
示例2:
2.逆序实现字符串左旋转
方法2:逆序实现字符串左旋,思路如下
我们可以通过三次逆序操作实现字符串左旋,以arr+n(n为输入的左旋转字符个数,必要时,进行取余操作)。这样我们只需要编写一个可以逆序字符串的函数,进行三次调用,分别对前半段,后半段以及整个数组进行操作即可实现n个字符串左旋,实现如下:
#include<stdio.h>
#include<string.h>
#include<assert.h>
//字符串逆序
char* reverse_string(char* left, char* right)
{
char* ret = left;
assert(left && right);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
return ret;
}
//字符串左旋
void LeftRotateString(char* str, int n)
{
int len = strlen(str);
n %= len;//避免越界访问
char* ret = str;
//处理前半段
reverse_string(str, str + n - 1);
//处理后边段
reverse_string(str + n, str + len - 1);
//处理整个数组
reverse_string(str, str + len - 1);
}
int main()
{
char arr[100] = { 0 };
scanf("%s", arr);
int n = 0;
scanf("%d", &n);
LeftRotateString(arr, n);
printf("%s\n", arr);
return 0;
}
输出结果: