(剑指 Offer 58 - II) 左旋转字符串

地址:

力扣https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/

题目:

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

示例 1:

输入: s = "abcdefg", k = 2
输出: "cdefgab"
示例 2:

输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"

限制:

1 <= k < s.length <= 10000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

因为可以开辟空间存放,所以最简单的做法就是从切割处开始,后半部依次拷贝到新空间;完成后再从头拷贝到切割处的位置长度到新空间

方法一、前后部分别拷贝

char* reverseLeftWords(char* s, int n){
    int i,j;
    int len = strlen(s);
    char *array = (char *)malloc(sizeof(char)*len + 1);

    if(array == NULL)
        return NULL;

    /* normal method */
    for(i=n,j=0; i<len; i++,j++)
    {
        array[j] = s[i];
    }

    for(i=0; i<n; i++,j++)
    {
        array[j] = s[i];
    }

    array[j]='\0';

    return array;
}

方法二、求余拷贝

相对于前后拷贝的方式,我们其实也在找需要拷贝的元素下标

考虑一个整型数,比如 8。那么 0%8=0, 1%8=1...8%8=0。

那么从切割处,比如 5 开始拷贝到末尾后前面的 0,1,2,3,4元素,不也可以通过求余来找到么

char* reverseLeftWords(char* s, int n){
    int i,j;
    int len = strlen(s);
    char *array = (char *)malloc(sizeof(char)*len + 1);

    if(array == NULL)
        return NULL;

    /* advance method */
    for(i=0,j=0; i<len; i++,j++)
    {
        array[j] = s[(i+n)%len];
    }

    array[j]='\0';

    return array;
}

结束语:

以前用 求余 "%" 方式通常用在计算整型数的十位,百位,千位这类,搭配 "/" 完成

数组方式也算是新的一个技巧掌握了

 查看更多刷题笔记

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值