题目如下:
把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
详情请见力扣: 左旋转字符串
以下的代码均以在力扣AC
暴力遍历法
这种应该是最容易想到的方法了,要将前n位字符移位就整体向前移位n次,每次整体移位的时候都将此时的首字符移到字符尾。
(n^2去世)
char* reverseLeftWords(char* s, int n){
/*暴力遍历法*/
int len = strlen(s);
for(int i = 0;i<n;i++)
{
int temp = s[0];
for(int j = 1;j<len;j++)
{
s[j-1] = s[j];
}
s[len-1] = temp;
}
return s;
}
空间换时间法
就是再开辟一个数组用来接收后len-n位和前n位
char* reverseLeftWords(char* s, int n){
/*空间换时间法*/
char *temp;
int len = strlen(s);
temp = (char *)malloc(sizeof(char)*(len+1));
for(int i = n;i<len;i++)
{
temp[i-n] = s[i];
}
for(int i = 0;i<n;i++)
{
temp[len-n+i] = s[i];
}
temp[len] = '\0';
return temp;
}
库函数复制法
C语言对于字符串提供了许多的字符串处理函数。
下面我们主要用到strcpy(str1,str2)
函数(将str2所指的字符串复制到str1中 )
和strncpy(str1,str2,n)
函数(将str2所指的前n位复制到str1中)
char* reverseLeftWords(char* s, int n){
/*库复制函数法*/
char *temp;
int len = strlen(s);
temp = (char *)malloc(sizeof(char)*(len+1));
strcpy(temp,s+n);
strncpy(temp+len-n,s,n);
temp[len] = '\0';
return temp;
}
取余法
此法可以看作是暴力法的简化版,取余法超级丝滑
/*取余法*/
int i = 0;
int len = strlen(s);
char *temp = malloc(sizeof(char)*(len+1));
while(i<len)
{
*(temp++) = s[(n+i++)%len];
}
*temp = '\0';//截取长度len
return temp-len;//因为return上面那一步后ans指向的是空字符,return ans-len是让指针指向第一个字符/*/
}
求逆交换法
不重新开辟一个空间,直接在原数组里面分段交换字符
但是这种方法需要另外定义一个函数,当然你for写三遍也不是不行
void reverse(int p,int q,char *s)
{
int i,j;
for(i = p,j = q;i<j;i++,j--)
{
char temp = s[j];
s[j] = s[i];
s[i] = temp;
}
}
char* reverseLeftWords(char* s, int n){
int len = strlen(s);
reverse(0,n-1,s);
reverse(n,len-1,s);
reverse(0,len-1,s);
return s;
}
以上的5种方法可以为我们提供很多思路