• 189-RotaeArray


    旋转数组

    字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。

    比如,输入字符串"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
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    自己的代码

    class Solution {
        public String reverseLeftWords(String s, int n) {
            return s.substring(n) + s.substring(0,n);
        }
    }
    

    这个题目就是对于字符串进行操作,所以需要对于字符串的裁剪,拼接这些常用函数比较熟悉。

    str.substring(int beginIndex, int endIndex)

    • 截取 [beginIndex, endIndex) 的闭开区间(注意索引值从0开始);
    • 若只传入 beginIndex,将字符串从索引号为beginIndex开始截取,一直到字符串末尾;
    • 根据某个字符作为字符串截取标志
    String sb = "53285964@qq.com";
    String str = sb.substring(0, sb.indexOf("@"));
    System.out.println(str);    // 结果:53285964
    // indexOf(String str)方法返回的是子字符串第一次出现在字符串的索引位置
    // 上面的代码返回的是@前面的字符。
    

    其他思路

    空间换时间

    我们用 s + s 拼成一个两倍长度的字符串, 这样s[k:n + k] 就是我们要求的结果。
    这个方法的缺点就是多占据了一倍的空间。时空复杂度都是 O(N)

    python3 代码

    • 首先解释一下,系统给出的模板是什么意思。
    • def reverseLeftWords(self, s: str, k: int) -> str:
    • 函数注释包括参数注释(:)返回值注释(->)。意思是 s 需要的类型是 str,k 需要的类型是 int。最后的 -> int 代表返回值是 str 类型。
    • 这是python3引入的新特性,更加详细的内容链接
    class Solution:
        def reverseLeftWords(self, s: str, k: int) -> str:
            n = len(s)
            s = s + s
            return s[k:n + k]
    
    作者:fe-lucifer
    链接:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/solution/chao-jian-dan-duo-chong-jie-fa-python3-by-azl39798/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

    取模法

    针对上面多占据了一倍空间的方法,我们可以虚拟的接上一个新字符串,也就是使用取模的方法进行循环。
    时间复杂度为 O(N);空间复杂度为 O(1)

    class Solution:
        def reverseLeftWords(self, s: str, k: int) -> str:
            n = len(s)
            res = ''
            for i in range(k, k + n):
                res += s[i % n]
            return res
    
    作者:fe-lucifer
    链接:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/solution/chao-jian-dan-duo-chong-jie-fa-python3-by-azl39798/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

    C语言版本

    C语言的执行速度和内存会更胜一筹。下面放一个参考代码。

    char* reverseLeftWords(char* s, int n){
        int len = strlen(s),i = 0;
        char *ans = malloc(sizeof(char) * (len + 1));
        while(i < len){
            *(ans++) = s[(n + i++)%len];    // 使用了上面的取模方法解决的,尤其注意优先级!
        }
        *ans= '';
        return ans - len;
    }
    
    作者:ning-junzhi
    链接:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/solution/cjian-dan-yi-dong-de-jie-fa-by-ning-junzhi/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    char* reverseLeftWords(char* s, int n){
        int len = strlen(s), k = 0;
        char *res = malloc((len+1)*sizeof(char));    // 新建一个长度 len+1 的内存空间res,类型为char
        char *p = s + n;    // 指针p指向 s+n 位置
        for(int i = 0; i < len - n; i++){
            res[k++] = p[i];    // 把指针p之后的内容先放到 res 中
        }
        for(int i = 0; i < n; i++){
            res[k++] = s[i];    // 将s的头部内容放入 res 中
        }
        res[k] = '';        // res 最后一位置为结束标志
        return res;
    }
    
    作者:newpp
    链接:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/solution/cjie-fa-li-yong-xin-zhi-zhen-ding-wei-shuang-100-b/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
  • 相关阅读:
    箭头函数中的this
    剑指offer(十六) 合并两个排序的链表
    http中的referer
    剑指offer(十四,十五)链表中倒数第k个结点,反转链表
    剑指offer(十二,十三) 数值的整数次方,调整数组顺序使奇数位于偶数前面
    那些短小精悍的&奇葩的&令人感到惊讶的JavaScript代码----更新中
    对箭头函数的补充
    Promise和Async/Await用法整理
    Vue父子组件互相通信实例
    Vue实例里面的data属性为什么用函数返回
  • 原文地址:https://www.cnblogs.com/rongyupan/p/12629679.html
Copyright © 2020-2023  润新知