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

在这里插入图片描述

解法一:字符串切分与拼接(使用辅助空间)

(题目有限制,字符串长大于1,则不可能为空。同时,k小于字符串长,所以k不用取余。)
先申请一块辅助空间,用于临时保存拼接后的字符串。从旋转的位置开始,把字符串分为2部分空间。先将第2部分放入辅助空间,再将第一部分放入,拼接完成。最后将拼接好的字符串放回原数组,并释放辅助空间。

char* reverseLeftWords(char* s, int n){
    int len = strlen(s);
    // 申请辅助空间,将原数组分区间放到temp数组拼接
    char *temp = malloc(sizeof(char)*(len+1));
    int index = 0;
    for(int i=n; i<len; i++)
    {
        temp[index++] = s[i];
    }
    for(int j=0; j<n; j++)
    {
        temp[index++] = s[j];
    }
    temp[index] = '\0';//字符串结束标志不要忘了
    // 拼接好的字符串放回原数组,并释放辅助空间
    for(int k=0; k<len; k++)
    {
        s[k] = temp[k];
    }
    free(temp);
    return s;
}

时间复杂度 O ( n ) O(n) O(n):两次遍历
空间复杂度 O ( n ) O(n) O(n):使用辅助空间

解法二:先局部翻转,再整体翻转(三次翻转)

void swap(char *a, char *b)
{
    char temp = *a;
    *a = *b;
    *b = temp;
}

char* reverseLeftWords(char* s, int n){
    int len = strlen(s);
    int p,q;//双指针

    // 局部翻转
    // 第一区间翻转
    p = 0, q=n-1;
    while(p<q)
    {
        swap(&s[p++], &s[q--]);
    }
    // 第二区间翻转
    p = n, q = len-1;
    while(p<q)
    {
        swap(&s[p++], &s[q--]);
    }
    // 整体翻转
    p = 0, q = len-1;
    while(p<q)
    {
        swap(&s[p++], &s[q--]);
    }
    return s;
}

时间复杂度 O ( n ) O(n) O(n):两次遍历
空间复杂度 O ( 1 ) O(1) O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值