代码随想录算法训练营DAY 8 | 344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串

344. 反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

解题:思路比较简单,双指针左右同时移动,用数组转换的方式交换值

/**
 * @param {character[]} s
 * @return {void} Do not return anything, modify s in-place instead.
 */
var reverseString = function(s) {
    let left = 0, right = s.length - 1;
    while(left

​​​​​​541. 反转字符串 II

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

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

解题:反转比较好理解,主要是这个2k,可以在for循环上,加入每次 i+2*k,即可控制整个遍历

/**
 * @param {string} s
 * @param {number} k
 * @return {string}
 */
var reverseStr = function(s, k) {
    let arr = s.split('')
    let len = arr.length - 1
    for(let i = 0;i< arr.length;i+=2*k) {
        if(len - i + 1 >= k) {
            let left = i, right = i + k - 1;
            while(left < right) {
                [arr[left], arr[right]] = [arr[right], arr[left]]
                left++
                right--
            }
        } else {
            let left = i, right = len;
            while(left < right) {
                [arr[left], arr[right]] = [arr[right], arr[left]]
                left++
                right--
            }
        }
    }
    return arr.join('')
};

剑指 Offer 05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

解题:这里是先转换成数组,判断当前数组有多少空格,然后新增数组的长度,从右往左(从尾向头)遍历,这里也是双指针的思路,左指针判断为空格时给右指针赋三个值,其他情况直接赋值

/**
 * @param {string} s
 * @return {string}
 */
var replaceSpace = function(s) {
    const arr = Array.from(s)
    let count = 0
    for(let i = 0;i=0) {
        if(arr[left]===' ') {
            arr[right--] = '0'
            arr[right--] = '2'
            arr[right--] = '%'
            left--
        } else {
            arr[right--] = arr[left--]
        }
    }
    return arr.join('')
};

​​​​​​151. 反转字符串中的单词

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

解题:先处理掉多余空格,然后反转整个字符串,然后遍历遇到单词时单独反转,需要把反转单独抽离作为一个函数

/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
    let arr = Array.from(s);

    removeExtraSpaces(arr)

    reverseWord(arr, 0, arr.length-1)

    let start = 0
    for (let i = 0;i<=arr.length;i++) {
        if(arr[i] === ' ' || i === arr.length) {
            reverseWord(arr, start, i - 1)
            start = i + 1
        }
    }
    return arr.join('')
};

function removeExtraSpaces(arr) {
    let slow = 0, fast = 0;
    while(fast < arr.length) {
        if(arr[fast] === ' ' && (fast === 0 || arr[fast - 1] === ' ')) {
            fast++
        } else{
            arr[slow++] = arr[fast++]
        }
    }
    arr.length = arr[slow-1] === ' ' ? slow - 1 : slow
}

function reverseWord(arr, startIndex, endIndex) {
    let left = startIndex, right = endIndex;
    while(left < right) {
        [arr[left], arr[right]] = [arr[right], arr[left]]
        left++
        right--
    }
}

剑指 Offer 58 - II. 左旋转字符串

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

解题:这里做的还是比较简单,直接往字符串最后塞值,然后做切割,看别的思路好像不是这样,应该多学习其他的做法

/**
 * @param {string} s
 * @param {number} n
 * @return {string}
 */
var reverseLeftWords = function(s, n) {
    for(let i = 0;i

你可能感兴趣的:(算法,数据结构)