算法打卡第八天 字符串1 力扣344,541,05,151,58

54 阅读1分钟

344. 反转字符串

第一眼看上去我直接就是reverse秒杀,然后想想用库函数并不会更自己带来神什么提升,尝试使用别的方法

方法1:

var reverseString = function(s) {
    let mid;
    let right = s.length -1;
    // 通过求数组中间数,决定循环的次数
    if (s.length% 2 !== 0) {
        mid = Math.floor(s.length/ 2) 
    } else {
        mid = s.length/2;
    }
    // 然后置换元素
    for (let i = 0; i < mid; i++) {
        let temp = s[i];
        s[i] = s[right - i];
        s[right - i] = temp
    }

}

方法2: 发现方法1的求中间下标值有些多余,其实只要用双指针,判断左指针小于右指针就行了,这样不用判断数组长度是奇数还是偶数。

var reverseString = function(s) {
    let l = 0;
    let r = s.length -1;
    while(l < r) {
        let temp = s[r];
        s[r] = s[l];
        s[l] = temp;
        l++;
        r--; 
    }
};

541. 反转字符串 II

var reverseStr = function(s, k) {
    let resArr =s.split('');
    let len = resArr.length;
    for (let i = 0; i < len; i += 2 * k) {
        // 剩余字符的前k个字符反转
        let l = i - 1, r = i + k > len ? len : i + k;
        while(++l < --r) {
            [resArr[l], resArr[r]] = [resArr[r], resArr[l]];
        }
    }
    return resArr.join('')
}

剑指 Offer 05. 替换空格

var replaceSpace = function(s) {
    let arr = s.split('');
    for(let i = 0; i < arr.length; i++) {
        if (arr[i] == ' ') {
            arr[i] = '%20';
        }
    }
    return arr.join('');
};

151. 反转字符串中的单词

var reverseWords = function(s) {
    // 相比剑指Offer 05.替换空格 多了一步处理空格操作
    let arr = s.split(' ');
    // 去除所有的空字符串
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] == '') {
            arr.splice(i, 1);
            i--;
        }
    }
    // 然后做反转处理
    let l = 0, r = arr.length - 1;
    while (l < r) {
        let temp = arr[r];
        arr[r] = arr[l];
        arr[l] = temp;
        l++;
        r--;
    }
    return arr.join(' ');
};

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

var reverseLeftWords = function (s, n) {
    let start = s.slice(0, n);
    let end = s.slice(n);
    return end + start;
};