题目
- 输入一个字符串,切换其中字母的大小写
- 如,输入字符串 12aBc34 ,输出字符串 12AbC34
常见思路
- 正则表达式
- 通过ASCII码判断
/**
* @description 切换字母大小写
* @author lsr
*/
/**
* 切换字母大小写 - 正则表达式
* @param str
* @returns
*/
export function switchLetterCase1(str: string): string {
let res = ''
const length = str.length
if (length === 0) return res
const reg1 = /[A-Z]/
const reg2 = /[a-z]/
for (let i = 0; i < length; i++) {
const c = str[i]
if (reg1.test(c)) {
res += c.toLowerCase()
} else if (reg2.test(c)) {
res += c.toUpperCase()
} else {
res += c
}
}
return res
}
/**
* 切换字母大小写 - ASCII 编码
* @param str
* @returns
*/
export function switchLetterCase2(str: string): string {
let res = ''
const length = str.length
if (length === 0) return res
for (let i = 0; i < length; i++) {
const c = str[i]
const code = c.charCodeAt(0)
if (code >= 65 && code <= 90) {
res += c.toLowerCase()
} else if (code >= 97 && code <= 122) {
res += c.toUpperCase()
} else {
res += c
}
}
return res
}
// 功能测试
// console.log(switchLetterCase1('12aBc34'))
// 性能测试
const str = '12aBc3412aBc3412aBc3412aBc3412aBc3412aBc3412aBc3412aBc3412aBc3412a'
console.time('switchLetterCase1')
for (let i = 0; i < 10 * 10000; i++) {
switchLetterCase1(str)
}
console.timeEnd('switchLetterCase1') // 288.947021484375 ms
console.time('switchLetterCase2')
for (let i = 0; i < 10 * 10000; i++) {
switchLetterCase2(str)
}
console.timeEnd('switchLetterCase2') // 97.89306640625 ms
单元测试
/**
* @description 切换字母大小写 test
* @author lsr
*/
import {
switchLetterCase1,
switchLetterCase2
} from '@/01-algorithm/switch-letter-case'
describe('切换字母大小写', () => {
it('正常情况', () => {
expect(switchLetterCase2('12aBc34')).toBe('12AbC34')
})
it('非字母', () => {
expect(switchLetterCase2('12312')).toBe('12312')
})
it('空字符串', () => {
expect(switchLetterCase2('')).toBe('')
})
})
性能分析
- 使用正则表达式,性能较差
- 使用ASCII码判断,性能较好——推荐答案
划重点
- 慎用正则表达式
- 常见字符的 ASCII 码