【卡码网】55. 右旋转字符串——代码随想录算法训练营Day08

题目链接:55. 右旋转字符串

题目描述

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。 

例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。

输入描述

输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。

输出描述

输出共一行,为进行了右旋转操作后的字符串。

输入示例
2
abcdefg
输出示例
fgabcde
提示信息

数据范围:
1 <= k < 10000,
1 <= s.length < 10000;

文章讲解:代码随想录

题解1:两轮翻转

思路:把字符串分为2部分,目标是把右边移到左边。可以先整体翻转一次字符串,此时字符串顺序为反向的右部分和反向的左部分,再将这2部分反转一遍,即可得到答案。

注意:此题为 ACM 模式,需要自己在代码中读取输入,打印输出。

const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

const num = 2;
const inputs = [];

const reverse = function (arr, start = 0, end = arr.length) {
    end = end - 1;
    while (start < end) {
        const _ = arr[start];
        arr[start++] = arr[end];
        arr[end--] = _;
    }
}

rl.on("line", (row) => {
    inputs.push(row);
    if (inputs.length < num) {
        return;
    }
    let k = parseInt(inputs[0]), s = inputs[1];
    s = s.split("");
    reverse(s);
    reverse(s, 0, k);
    reverse(s, k, s.length);
    console.log(s.join(""));
});

分析:时间复杂度为 O(n),空间复杂度为 O(n)。

题解2:还是两轮翻转

思路:还是将字符串分为2部分,先将这2部分各自翻转一遍,再整体翻转一遍得出答案,和上个题解的不同在于区间不同。

const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

const num = 2;
const inputs = [];

const reverse = function (arr, start = 0, end = arr.length) {
    end = end - 1;
    while (start < end) {
        const _ = arr[start];
        arr[start++] = arr[end];
        arr[end--] = _;
    }
}

rl.on("line", (row) => {
    inputs.push(row);
    if (inputs.length < num) {
        return;
    }
    let k = parseInt(inputs[0]), s = inputs[1];
    s = s.split("");
    reverse(s, 0, s.length - k);
    reverse(s, s.length - k, s.length);
    reverse(s);
    console.log(s.join(""));
});

分析:时间复杂度为 O(n),空间复杂度为 O(n)。

收获

1. 对字符串翻转有了进一步的理解。

2. 了解了 ACM 模式的机试题,输入需要自己写代码来读取,输出也需要自己写代码来输出。

你可能感兴趣的:(代码随想录算法训练营,算法,代码随想录算法训练营,字符串)