左旋转字符串(剑指offer)---C语言

该博客主要讲解如何使用C语言实现字符串的左旋转操作,即把字符串前面的指定数量字符移到尾部。通过示例,如将字符串'abcdefg'左旋转2位得到'cdefgab',详细解析了实现该功能的代码逻辑。
摘要由CSDN通过智能技术生成

剑指 Offer 58 - II. 左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

示例 1:

输入: s = “abcdefg”, k = 2
输出: “cdefgab”

示例 2:

输入: s = “lrloseumgh”, k = 6
输出: “umghlrlose”

char* reverseLeftWords(char* s, int n){
    int i = 0;
    if(s[0]=='\0'|| n<=0) return s;
    i = strlen(s); //统计s长度

    char *s1 =malloc(sizeof(char)*(i+1));
    int j;
    for(j=0;j<i-n;j++)
    {
        s1[j]=s[n+j];
    }
    
    for(int k=0;k<n;k++)
    {
        s1[i-n+k]=s[k];
    }
    s1[i]='\0';
    return s1;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,可以通过暴力移位法或者Left函数实现字符串旋。其中,暴力移位法是通过循环移位的方式实现字符串旋,而Left函数则是通过将字符串分为两部分,分别进行翻转,再将整个字符串翻转的方式实现字符串旋。 以下是两种实现字符串旋的方法: 1. 暴力移位法 ```c #include <stdio.h> #include <string.h> void left_move(char* str, int k) { int len = strlen(str); int i = 0; k %= len; // 省去多余循环步骤,多出字符串长度会导致多余的循环操作 while (k--) { // 旋循环k次 char tmp = str[0]; // 创建tmp来存放字符串第一个字符 for (i = 0; i < len - 1; i++) { str[i] = str[i + 1]; // 后面的字符依次向前一位 } str[i] = tmp; // 在末尾放入tmp中的字符 } } int main() { char str[] = "ABCD"; left_move(str, 2); printf("%s\n", str); // 输出:CDAB return 0; } ``` 2. Left函数实现 ```c #include <stdio.h> #include <string.h> #include <assert.h> void Reverse(char *str, int start, int end) { // 翻转字符串 assert(str); while (start < end) { char tmp = str[start]; str[start] = str[end]; str[end] = tmp; start++; end--; } } void Left(char *str, int len, int n) { assert(str); // 断言str不为空 assert(len); // 断言字符串长度不为0 assert(n); // 断言输入旋次数不为0 n %= len; // 省去多余循环步骤,多出字符串长度会导致多余的循环操作 Reverse(str, 0, n - 1); // 翻转前半部分 Reverse(str, n, len - 1); // 翻转后半部分 Reverse(str, 0, len - 1); // 整个字符串翻转 } int main() { char str[] = "ABCD"; Left(str, strlen(str), 2); printf("%s\n", str); // 输出:CDAB return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值