字符串移位算法总结


题目如下:
把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"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种方法可以为我们提供很多思路

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值