zoukankan      html  css  js  c++  java
  • 541. 反转字符串 II(简单)

    541. 反转字符串 II

    题目链接:541. 反转字符串 II(简单)

    题目描述

    给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

    • 如果剩余字符少于 k 个,则将剩余字符全部反转。

    • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

    示例 1:

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

    示例 2:

    输入:s = "abcd", k = 2
    输出:"bacd"

    提示:

    • 1 <= s.length <= 104

    • s 仅由小写英文组成

    • 1 <= k <= 104

    题解

    思路:首先需要找到大区间,然后需要找到大区间里面需要反转的小区间。通过题目描述不难发现,每次大区间的其实位置都会间隔 2k 。大区间的起始位置也是反转小区间的起始位置,接着找出反转小区间的终点位置,终点位置有两种情况:一是能取到 k 个元素,二是取不到 k 个元素。

    代码(C++)

    string reverseStr(string s, int k) {
        // i 每次移动 2 * k
        for (int i = 0; i < s.size(); i = i + 2 * k) {
            // left 和 right 定义需要反转的区间
            int left = i;
            int right;
            //判断要交换的区间里面还有没有 k 个元素
            if (i + k - 1 >= s.size()) {
                right = s.size() - 1;
            } else {
                right = i + k - 1;
            }
            //将区间内的元素进行交换
            while (left < right) {
                int temp = s[left];
                s[left] = s[right];
                s[right] = temp;
                left++;
                right--;
            }
        }
        return s;
    }

    分析:

    • 时间复杂度:O(N)

    • 空间复杂度:O(1)

    参考链接

    官方题解

    代码随想录

  • 相关阅读:
    LeetCode 79. 单词搜索
    LeetCode 1143. 最长公共子序列
    LeetCode 55. 跳跃游戏
    LeetCode 48. 旋转图像
    LeetCode 93. 复原 IP 地址
    LeetCode 456. 132模式
    LeetCode 341. 扁平化嵌套列表迭代器
    LeetCode 73. 矩阵置零
    LeetCode 47. 全排列 II
    LeetCode 46. 全排列
  • 原文地址:https://www.cnblogs.com/wltree/p/15523126.html
Copyright © 2011-2022 走看看