前端算法·专项攻破八:字符串

257 阅读2分钟

概念理解

字符串(英语:string),是由零个或多个字符组成的有限序列。

使用场景

字符串是JS的基本数据类型,也是算法面试中的常客。应对此类题型,我们不仅要掌握字符串的常用操作方法,要知道哪些操作会改变原字符串,哪一些是生成新的字符串,还要知道字符串的各种遍历方法,以及一些简单的正则匹配语法。详细可参考 前端算法入门一:刷算法题常用的JS基础扫盲

例题讲解

题目: 字符串变形

描述

对于一个长度为 n 字符串,我们需要对它做一些变形。

首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。

比如"Hello World"变形后就变成了"wORLD hELLO"。

进阶:空间复杂度 O(n)O(n) , 时间复杂度 O(n)O(n)

输入描述:

给定一个字符串s以及它的长度n(1 ≤ n ≤ 10^6)

返回值描述:

请返回变形后的字符串。题目保证给定的字符串均由大小写字母和空格构成。

示例1

输入:

"This is a sample",16

返回值:

"SAMPLE A IS tHIS"

示例2

输入:

"nowcoder",8

返回值:

"NOWCODER"

示例3

输入:

"iOS",3

返回值:

"Ios"

题解:

/**
 * 解法一:正则
 * 时间复杂度:O(n)
 * 空间复杂度:O(n)
 */
export function trans(s: string, n: number): string {
    let res: string = ''
    if (s.length === 0 || n === 0) return res
    
    // 翻转
    const revStrArr: string[] = s.split(' ').reverse()
    const revStr: string = revStrArr.join(' ')
    
    // 大小写转换
    const reg1 = /[a-z]/
    const reg2 = /[A-Z]/
    for (let i = 0; i < revStr.length; i++) {
        if (reg1.test(revStr[i])) {
            res += revStr[i].toUpperCase()
        } else if (reg2.test(revStr[i])) {
            res += revStr[i].toLowerCase()
        } else {
            res += ' '
        }
    }
    
    return res
}

/**
 * 解法二:charAtCode(0)性能更好,推荐
 * 时间复杂度:O(n)
 * 空间复杂度:O(n)
 */
export function trans(s: string, n: number): string {
    let res = ''
    if (s.length === 0 || n === 0) return res
    
    // 翻转
    const revStrArr = s.split(' ').reverse()
    const revStr = revStrArr.join(' ')
    
    // 大小写转换
    for (let i = 0; i < revStr.length; i++) {
        const code = revStr[i].charCodeAt(0)
        if (code >= 97 && code <= 122) {
            res += revStr[i].toUpperCase()
        } else if (code >= 65 && code <= 90) {
            res += revStr[i].toLowerCase()
        } else {
            res += ' '
        }
    }
    
    return res
}

题集&题解

序号题目题解难度
1字符串变形题解easy
2最长公共前缀题解easy
3验证IP地址题解hard
4大数加法题解hard

相关文章

您的点赞和评论是我持续更新的动力,感谢关注。