开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情
题目 leetcode.cn/
- 给你一个由英文字母组成的字符串
s,请你找出并返回s中的 最好 英文字母。返回的字母必须为大写形式。如果不存在满足条件的字母,则返回一个空字符串。 - 最好 英文字母的大写和小写形式必须 都 在
s中出现。 - 英文字母
b比另一个英文字母a更好 的前提是:英文字母表中,b在a之 后 出现。
示例
- 示例 1:
- 输入: s = "lEeTcOdE"
- 输出: "E"
- 解释:字母 'E' 是唯一一个大写和小写形式都出现的字母。
- 示例 2:
- 输入: s = "arRAzFif"
- 输出: "R"
- 解释:字母 'R' 是大写和小写形式都出现的最好英文字母。注意 'A' 和 'F' 的大写和小写形式也都出现了,但是 'R' 比 'F' 和 'A' 更好。
- 示例 3:
- 输入:s = "AbCdEfGhIjK"
- 输出:""
- 解释:不存在大写和小写形式都出现的字母。
提示:
代码
function greatestLetter(s: string): string {
let max = 0;
for(let i = 0; i < s.length; i++){
if(s.charCodeAt(i) >= 97){
let index = s.charCodeAt(i) - 32;
if(s.includes(String.fromCharCode(index))){
max = Math.max(max, index);
}
} else {
let index = s.charCodeAt(i) + 32;
if(s.includes(String.fromCharCode(index))){
max = Math.max(max, s.charCodeAt(i));
}
}
}
return max ? String.fromCharCode(max) : '';
};
-
ASCII + 遍历统计:
-
核心就是大小写字母他们的
ASCII码不一样,a的ASCII是97,A的ASCII是65,每个大写字母和它的小写字母相差32 -
遍历整个字符串,依次使用
charCodeAt求出当前字符的ASCII,判断当前字符是大写字母还是小写字母- 如果是小写字母,那么它对应的大写字母的
ASCII需要减去32,再使用fromCharCode转化成对应的大写字母,判断其在不在原字符串中,如果在,那么与开始定义的变量比较ASCII的大小,因为最后返回的是大写字母的靠后的哪一个 - 如果是大写字母,那么它对应的大写字母的
ASCII需要加上32,再使用fromCharCode转化成对应的大写字母,判断其在不在原字符串中,如果在,那么与开始定义的变量比较ASCII的大小
- 如果是小写字母,那么它对应的大写字母的
-
最后判断
max是否为0,因为如果没有最好英文字母的话,max就是初始值- 如果是
0,则返回空字符串 - 否则返回
fromCharCode后的字母
- 如果是
-
结果
-
ASCII + 遍历统计: