左旋转字符串

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

方法一:分配新空间
1、将s[n – strlen(s) - 1]的字符拷贝到新空间tmp[0 – strlen(s) - n + 1]上
2、再将s[0 – n - 1]的字符拷贝到tmp[strlen(s) - n – strlen(s) - 1]上,返回tmp即可;

char* reverseLeftWords(char* s, int n){
    char* tmp = (char*)malloc(sizeof(char) * (strlen(s) + 1));
    int index = 0;
    for (int i = n; i < strlen(s); i++) {
        tmp[index++] = s[i];
    }
    for (int i = 0; i < n; i++) {
        tmp[index++] = s[i];
    }
    tmp[index] = '\0';
    return tmp;
}

也可直接利用C语言的字符串函数

char* reverseLeftWords(char* s, int n){
    int len = strlen(s);
    char *ret = calloc(len + 1, 1);  //len+1:'\0'   重新建立一个连续空间的数组

//char * strncpy ( char * destination, const char * source, size_t num );
//拷贝num个字符从源字符串到目标空间。
    strncpy(ret, s + n, len - n); 
    strncpy(ret + len - n, s, n);
    
    return ret;
}

方法二:不开辟新空间,利用翻转
1、反转区间为前n的子串
2、反转区间为n到末尾的子串
3、反转整个字符串

char* reverseLeftWords(char* s, int n){
    /* 翻转前n个字符 */
    int left = 0, right = n - 1;
    while (left < right) {
        char tmp = s[left];
        s[left] = s[right];
        s[right] = tmp;
        left++;
        right--;
    }
    /* 翻转n - strlen(s) - 1个字符 */
    left = n;
    right = strlen(s) - 1;
    while (left < right) {
        char tmp = s[left];
        s[left] = s[right];
        s[right] = tmp;
        left++;
        right--;
    }
    /* 翻转全部字符 */
    left = 0;
    right = strlen(s) - 1;
    while (left < right) {
        char tmp = s[left];
        s[left] = s[right];
        s[right] = tmp;
        left++;
        right--;
    }
    return s;
}

方法三:利用双指针,和开辟新空间相似

char* reverseLeftWords(char* s, int n){
    int len = strlen(s), k = 0;
    char *res = malloc((len+1)*sizeof(char));
    char *p = s + n;
    for(int i = 0; i < len - n; i++){
        res[k++] = p[i];
    }
    for(int i = 0; i < n; i++){
        res[k++] = s[i];
    }
    res[k] = '\0';
    return res;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值