100道前端面试题(十一): 切换字母大小写(TS+单元测试)

155 阅读1分钟

前言

(11)-1.webp

今天我们来分享一下如何使用算法切换字母的大小写


样例输出

输入一个字符串,切换其中字母的大小写

示例1:

输出: str = '98211aBcDeeF$#xY'

输入: str = '98211AbCdEEf$#Xy'

示例2:

输出: str = '100$%你好'

输入: str = '100$%你好'

方法一(正则表达式)

解题思路:

使用正则表达式分别匹配大写和小写字母,使用toUpperCase()方法转换字母的大小写

代码演示:

export function switchLetterCase1(s: string): string {
    let res = ''

    const length = s.length
    if (length === 0) return res

    const reg1 = /[a-z]/
    const reg2 = /[A-Z]/

    for (let i = 0; i < length; i++) {
        const c = s[i]
        if (reg1.test(c)) {
            res += c.toUpperCase()
        } else if (reg2.test(c)) {
            res += c.toLowerCase()
        } else {
            res += c
        }
    }

    return res
}

方法二(ASCII)

解题思路:

通过查询字母的ASCII码,来判断字母是否为大小写,之后再通过toUpperCase()方法转换字母的大小写

代码演示:

export function switchLetterCase2(s: string): string {
    let res = ''

    let length = s.length
    
    for (let i = 0; i < length; i++) {
         let c = s[i]
         const c_ASC = c.charCodeAt(0)
         if (c_ASC >= 65 && c_ASC <= 90) {
               //  转化为小写
               c = c.toLowerCase()
               res+=c    
         } else if (c_ASC >= 97 && c_ASC <= 122) {
               //  转化为大写
               c = c.toUpperCase()
               res+=c 
         }  else {
               res+=c 
         }
    }

    return res
}

性能测试

// const str = '100aBcD$#xYz100aBcD$#xYz100aBcD$#xYz100aBcD$#xYz100aBcD$#xYz100aBcD$#xYz'
// console.time('switchLetterCase1')
// for (let i = 0; i < 10 * 10000; i++) {
//     switchLetterCase1(str)
// }
// console.timeEnd('switchLetterCase1') // 436ms

// console.time('switchLetterCase2')
// for (let i = 0; i < 10 * 10000; i++) {
//     switchLetterCase2(str)
// }
// console.timeEnd('switchLetterCase2') // 210ms

单元测试

describe('切换字母大小写', () => {
    it('正常', () => {
        const str = '100aBcD$#xYz'
        const res = switchLetterCase2(str)
        expect(res).toBe('100AbCd$#XyZ')
    })
    it('空字符串', () => {
        const res = switchLetterCase2('')
        expect(res).toBe('')
    })
    it('非字母', () => {
        const res = switchLetterCase2('100$%你好')
        expect(res).toBe('100$%你好')
    })
})