LeetCode:541.Reverse String II(按照要求反转字符串)

文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。

相关文章:

  1. LeetCode:55. Jump Game(跳远比赛)
  2. Leetcode:300. Longest Increasing Subsequence(最大增长序列)
  3. LeetCode:560. Subarray Sum Equals K(找出数组中连续子串和等于k)

文章目录:

java实现方式1: 

python实现方式1:

java实现方式2.

python方法实现2:

源码地址:


给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。

示例:

输入: s = "abcdefg", k = 2
输出: "bacdfeg"

要求:

该字符串只包含小写的英文字母。
给定字符串的长度和 k 在[1, 10000]范围内。


java实现方式1: 

   /**
     * 翻转字符串
     *
     * @param s 字符串s
     * @param k k
     * @return 字符串
     */
    private String getReverseString(String s, int k) {
        if (s.length() <= k) {
            return new StringBuffer(s).reverse().toString();
        }
        if (s.length() > k && s.length() <= 2 * k) {
            String subString = s.substring(0, k);
            subString = new StringBuffer(subString).reverse().toString();
            return subString + s.substring(k);
        }
        if (s.length() > 2 * k) {
            LinkedList<String> list = new LinkedList<>();
            StringBuffer sb = new StringBuffer();
            int number = s.length() / k;
            for (int i = 0; i < number; i++) {
                list.add(s.substring(i * k, i * k + k));
            }
            if (number * k < s.length()) {
                list.add(s.substring(number * k));
            }
            for (int index = 0; index < list.size(); index++) {
                if (index % 2 == 0) {
                    String temp = new StringBuffer(list.get(index)).reverse().toString();
                    sb.append(temp);
                } else {
                    sb.append(list.get(index));
                }
            }
            return sb.toString();
        }
        return null;
    }

时间复杂度:O(n)

空间复杂度:O(n)


python实现方式1:

def get_reverse_string(s, k):
    # 当s字符串长度小于k的值
    if len(s) <= k:
        return s[::-1]
    # 当字符串长度在k和2k之间
    if len(s) > k and len(s) <= 2 * k:
        temp_str = s[0: k]
        return temp_str[::-1] + s[k:len(s)]
    # 当字符串长度大于2*k
    if len(s) > 2 * k:
        list = []
        sb = ''
        number = len(s) // k
        for i in range(number):
            list.append(s[i * k:i * k + k])
        if number * k < len(s):
            list.append(s[number * k:len(s)])
        for i in range(len(list)):
            if i % 2 == 0:
                sb += list[i][::-1]
            else:
                sb += list[i]
        return sb
    return '-1'

时间复杂度:O(n)

空间复杂度:O(n)


java实现方式2.

   /**
     * 翻转字符串
     *
     * @param s 字符串s
     * @param k k
     * @return 字符串
     */
    public String reverseStr2(String s, int k) {
        LinkedList<String> list = new LinkedList<>();
        StringBuffer sb = new StringBuffer();
        int number = s.length() / k;
        for (int i = 0; i < number; i++) {
            list.add(s.substring(i * k, i * k + k));
        }
        if (number * k < s.length()) {
            list.add(s.substring(number * k));
        }
        for (int index = 0; index < list.size(); index++) {
            if (index % 2 == 0) {
                String temp = new StringBuffer(list.get(index)).reverse().toString();
                sb.append(temp);
            } else {
                sb.append(list.get(index));
            }
        }
        return sb.toString();
    }

时间复杂度:O(n)

空间复杂度:O(n)


python方法实现2:

def get_reverse_string(s, k):
        list = []
        sb = ''
        number = len(s) // k
        for i in range(number):
            list.append(s[i * k:i * k + k])
        if number * k < len(s):
            list.append(s[number * k:len(s)])
        for i in range(len(list)):
            if i % 2 == 0:
                sb += list[i][::-1]
            else:
                sb += list[i]
        return sb

时间复杂度:O(n)

空间复杂度:O(n)


源码地址:

https://github.com/zhangyu345293721/leetcode

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
给定一个整数数组 nums 和一个目标值 target,要求在数组中找出两个数的和等于目标值,并返回这两个数的索引。 思路1:暴力法 最简单的思路是使用两层循环遍历数组的所有组合,判断两个数的和是否等于目标值。如果等于目标值,则返回这两个数的索引。 此方法的时间复杂度为O(n^2),空间复杂度为O(1)。 思路2:哈希表 为了优化时间复杂度,可以使用哈希表来存储数组中的元素和对应的索引。遍历数组,对于每个元素nums[i],我们可以通过计算target - nums[i]的值,查找哈希表中是否存在这个差值。 如果存在,则说明找到了两个数的和等于目标值,返回它们的索引。如果不存在,将当前元素nums[i]和它的索引存入哈希表中。 此方法的时间复杂度为O(n),空间复杂度为O(n)。 思路3:双指针 如果数组已经排序,可以使用双指针的方法来求解。假设数组从小到大排序,定义左指针left指向数组的第一个元素,右指针right指向数组的最后一个元素。 如果当前两个指针指向的数的和等于目标值,则返回它们的索引。如果和小于目标值,则将左指针右移一位,使得和增大;如果和大于目标值,则将右指针左移一位,使得和减小。 继续移动指针,直到找到两个数的和等于目标值或者左指针超过了右指针。 此方法的时间复杂度为O(nlogn),空间复杂度为O(1)。 以上三种方法都可以解决问题,选择合适的方法取决于具体的应用场景和要求。如果数组规模较小并且不需要考虑额外的空间使用,则暴力法是最简单的方法。如果数组较大或者需要优化时间复杂度,则哈希表或双指针方法更合适。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值