栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021-10-20 面试题58 - II. 左旋转字符串(切片 / 列表 / 字符串)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021-10-20 面试题58 - II. 左旋转字符串(切片 / 列表 / 字符串)

解题思路

由于本题的多解法涉及到了 字符串为不可变对象 的相关概念,导致效率区别较大。因此,单列一节 三种方法的效率分析 ,望对各位有所帮助。

方法一:字符串切片

应用字符串切片函数,可方便实现左旋转字符串。

获取字符串 s[n:]s[n:] 切片和 s[:n]s[:n] 切片,使用 “++” 运算符拼接并返回即可。

复杂度分析:

  1. 时间复杂度 O(N) : 其中 NN 为字符串 ss 的长度,字符串切片函数为线性时间复杂度(参考资料);
  2. 空间复杂度O(N) : 两个字符串切片的总长度为 NN 。
class Solution {
    public String reverseLeftWords(String s, int n) {
        return s.substring(n, s.length()) + s.substring(0, n);
    }
}
方法二:列表遍历拼接

若面试规定不允许使用 切片函数 ,则使用此方法。

算法流程:
新建一个 list(Python)、StringBuilder(Java) ,记为 resres ;
先向 resres 添加 “第 n + 1n+1 位至末位的字符” ;
再向 resres 添加 “首位至第 nn 位的字符” ;
将 resres 转化为字符串并返回。
复杂度分析:
时间复杂度 O(N)O(N) : 线性遍历 ss 并添加,使用线性时间;
空间复杂度 O(N)O(N) : 新建的辅助 resres 使用 O(N)O(N) 大小的额外空间。

class Solution {
    public String reverseLeftWords(String s, int n) {
        StringBuilder res = new StringBuilder();
        for(int i = n; i < s.length(); i++)
            res.append(s.charAt(i));
        for(int i = 0; i < n; i++)
            res.append(s.charAt(i));
        return res.toString();
    }
}

利用求余运算,可以简化代码。

class Solution {
    public String reverseLeftWords(String s, int n) {
        StringBuilder res = new StringBuilder();
        for(int i = n; i < n + s.length(); i++)
            res.append(s.charAt(i % s.length()));
        return res.toString();
    }
}

方法三:字符串遍历拼接

若规定 Python 不能使用 join() 函数,或规定 Java 只能用 String ,则使用此方法。

此方法与 方法二 思路一致,区别是使用字符串代替列表。

复杂度分析:
时间复杂度 O(N)O(N) : 线性遍历 ss 并添加,使用线性时间;
空间复杂度 O(N)O(N) : 假设循环过程中内存会被及时回收,内存中至少同时存在长度为 NN 和 N-1N−1 的两个字符串(新建长度为 NN 的 resres 需要使用前一个长度 N-1N−1 的 resres ),因此至少使用 O(N)O(N) 的额外空间。

class Solution {
    public String reverseLeftWords(String s, int n) {
        String res = "";
        for(int i = n; i < s.length(); i++)
            res += s.charAt(i);
        for(int i = 0; i < n; i++)
            res += s.charAt(i);
        return res;
    }
}

同理,利用求余运算,可以简化代码。

class Solution {
    public String reverseLeftWords(String s, int n) {
        String res = "";
        for(int i = n; i < n + s.length(); i++)
            res += s.charAt(i % s.length());
        return res;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/337312.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号