前言
在LeetCode中有一道这样的题目,将字符串中的大写字母转换成相同的小写字母,要求稍微简单了一些,今天我们把他升级一下,要求改成将大写字母转为对应的小写字母,将小写字母转为对应的大写字母。
看看完整的题目描述
题目介绍:
给你一个字符串 s
,将该字符串中的大写字母转换成相同的小写字母,将小写字母转为相同的大写字母,返回新的字符串。
示例:
输入: s = "I am here!" 输出: "i AM HERE!"
分析
这道算法题本身要求不高,一般会被面试官用在对面试者的算法初步考察上。问题的关键点在于如何判定是大、小写的字母
方案一:正则匹配 - 大小写字母
针对大写字母、小写字母定义匹配的正则,来区分大小写字母
/** * @method toUpperOrLowerCase1 * @description 转换大小写字母 - 正则匹配 * @param s string * @returns string */ function toUpperOrLowerCase1(s: string): string { // 定义变量,接收最终结果 let newS = ''; // 字符串长度 const len = s.length; // 临界点判断 if (len === 0) return s; // 匹配小写字母的正则 const lowerCaseReg = /[a-z]/; // 匹配大写字母的正则 const upperCaseReg = /[A-Z]/; // 遍历每一个字符 for (let i = 0; i < len; i++) { // 小写字母匹配 if (lowerCaseReg.test(s[i])) { // 转为大写字母 newS += s[i].toUpperCase(); } else if (upperCaseReg.test(s[i])) { // 大写字母匹配 // 转为小写字母 newS += s[i].toLowerCase(); } else { // 其他字符匹配,直接拼接 newS += s[i]; } } // 返回结果 return newS; }
功能测试:
const s: string = 'I am here!'; console.log(toUpperOrLowerCase1(s)); // i AM HERE!
OK,没啥问题~
方案二:借助ASCII码值,匹配大小写字母
ASCII码是一种表示计算机系统中字符的方式,下图是ASCII对照表。
网络异常,图片无法展示
|
小课堂:
字符串的charCodeAt(index)
会返回对应索引index
位置字符的ASCII码值。
'a'.charCodeAt(0); // 97 'z'.charCodeAt(0); // 122 'A'.charCodeAt(0); // 65 'Z'.charCodeAt(0); // 90
重新来实现下上面的方法
/** * @method toUpperOrLowerCase2 * @description 转换大小写字母 - ASCII码匹配 * @param s string * @returns string */ function toUpperOrLowerCase2(s: string): string { // 定义变量,接收最终结果 let newS = ''; // 字符串长度 const len = s.length; // 临界点判断 if (len === 0) return s; // 每个字符转为ASCII码值 // 小写字母范围:a = 97 z = 122 // 大写字母范围:A = 65 Z = 90 for (let i = 0; i < len; i++) { // 返回字符串对应位置字符的ASCII码 const charCode = s.charCodeAt(i); // 小写字母ASCII码值范围 if (charCode >= 97 && charCode <= 122) { newS += s[i].toUpperCase(); } else if (charCode >= 65 && charCode <= 90) { // 大写字母ASCII码值范围 newS += s[i].toLowerCase(); } else { // 其他字符 newS += s[i]; } } // 返回结果 return newS; }
功能测试:
const s: string = 'I am here!'; console.log(toUpperOrLowerCase21(s)); // i AM HERE!
OK,这也没啥问题~
性能对比
两种方案孰优孰劣呢,直接用数据说话
// 测试字符串 const s = 'asdhfajhfdkjhaksjdf#JHJKHkjhk34#$%Qe234234hjkhaksfhkajsdf9789&*(78976^&&^7(*(80s9fdosjdf'; console.time('toUpperOrLowerCase1'); for (let i = 0; i < 20 * 10000; i++) { toUpperOrLowerCase1(s); } console.timeEnd('toUpperOrLowerCase1'); console.time('toUpperOrLowerCase2'); for (let i = 0; i < 20 * 10000; i++) { toUpperOrLowerCase2(s); } console.timeEnd('toUpperOrLowerCase2');
上图~
网络异常,图片无法展示
|
数据还是非常明显的,方案一使用正则表达式,在进行匹配查询时是非常消耗性能的,所以使用ASCII码值直接进行比对是更优的。