一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
题目描述
给你一个排序后的字符列表 letters ,列表中只包含小写英文字母。另给出一个目标字母 target,请你寻找在这一有序列表里比目标字母大的最小字母。
在比较时,字母是依序循环出现的。举个例子:
如果目标字母 target = 'z' 并且字符列表为 letters = ['a', 'b'],则答案返回 'a'
示例 1:
输入: letters = ["c", "f", "j"],target = "a"
输出: "c"
示例 2:
输入: letters = ["c","f","j"], target = "c"
输出: "f"
示例 3:
输入: letters = ["c","f","j"], target = "d"
输出: "f"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-smallest-letter-greater-than-target
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路分析
- 今天的算法每日一题是字符处理题目,题意简单明了,这个题目很重要的条件是排序后的字符列表 letters,我们利用这一条件,找到第一个比 target 的字符,即为答案。
- 第二个重要条件是在比较时,字母是依序循环出现的。可以转化为如果便利一次letters 找不到比 target 大的字符,letters[0] 即为答案。根据以上分析,实现代码如下:
- 在代码中,我使用了字符直接相减。为什么可以这样做?这里需要 char 的基础知识。char 类型是一个单一的 16 位 Unicode 字符;最小值是 \u0000(十进制等效值为 0);最大值是 \uffff(即为 65535);因此可以直接相减。
通过代码
class Solution {
public char nextGreatestLetter(char[] letters, char target) {
char ans = letters[0];
for (char letter : letters) {
if (letter - target > 0) {
ans = letter;
break;
}
}
return ans;
}
}
总结
- 上述算法的时间复杂度是O(n),空间复杂度是O(1)
- 坚持算法每日一题,加油!