算法合集 | 字符串| Leetcode 541 05 151

62 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天,点击查看活动详情

前言

本系列文章主要会总结一些常见的算法题目以及算法的易错点,难点,以及一些万用的公式,并且结合实际的 Leetcode 题目来进行加深理解以及实际应用,算法这种东西,属于是一到用时方恨少的类型,在平时总结一些常见的简单算法,经常磨练自己的算法思维,对于日常的开发还是能有不少的帮助的。

Leetcode 541. 反转字符串 II

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

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

示例:

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

解题

这道题算是 344. 反转字符串 的升级版,从对所有的字符串都进行反转,变成了指定一个长度进行反转,对于不满足这个长度的剩余部分采用不变化处理。

根据题意进行模拟,我们可以通过for循环中的最后一个参数 通常是 i++ 这道题可以改成 i += 2 * k 这样就实现了每次跳过 2*k 个元素,然后再去判断当前剩余的个数是否满足 2*k 个就可以了。

function reverseStr(s: string, k: number): string {
    let arr = s.split('')
    for (let i = 0; i < arr.length; i += 2 * k) {
        let l = i , r = i + k > arr.length ? arr.length - 1 : i + k - 1;
        while (l < r) {
            [arr[l], arr[r]] = [arr[r], arr[l]];
            r--
            l++
        }
    }
    return arr.join('')
};

图片.png

Leetcode 剑指 Offer 05. 替换空格

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

解题

简单题,因为js的字符串可以通过方法转换为数组,数组也有方法换回字符串,所以这道题就简单的转化为数组,然后遍历一遍数组将空格转为题目要求的字段,最后在换回字符串。

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

图片.png

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

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

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

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

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

示例 1:
输入: "the sky is blue"
输出: "blue is sky the"

解题

首先,题目中单词中间的空格个数并不一定是一个,在不使用额外的方法的情况下,我们需要自己编写一个函数去去除这些额外的空格,通过简单的循环遍历一遍字符串,有两个或者多个的空格的情况,要进行去除,只留下一个。

function delExtraSpace(str) {
    let strArr = str.split('');
    let left = 0;
    let right = 0;
    let length = strArr.length;
    while (right < length && strArr[right] === ' ') {
        right++;
    }
    while (right < length) {
        if (strArr[right] === ' ' && strArr[right - 1] === ' ') {
            right++;
            continue;
        }
        strArr[left++] = strArr[right++];
    }
    if (strArr[left - 1] === ' ') {
        strArr.length = left - 1;
    } else {
        strArr.length = left;
    }
    return strArr.join('')
}

图片.png

这一步完成以后,剩下的就是简单的反转每一个单词,因为上面的那一步已经把每一个单词的间隔都变为了一个,所以就可以直接用空格进行分割,然后转化

function reverseWords(s: string): string {
    let arr = delExtraSpace(s).split(' ')
    let l = 0;
    let r = arr.length-1
    while(l<r){
        [arr[l],arr[r]] = [arr[r],arr[l]]
        l++
        r--
    }
    return arr.join(' ')
};

图片.png