题目地址
问题
给你一个排序后的字符列表 letters ,列表中只包含小写英文字母。另给出一个目标字母 target,请你寻找在这一有序列表里比目标字母大的最小字母。
在比较时,字母是依序循环出现的。举个例子:
如果目标字母 target = 'z' 并且字符列表为 letters = ['a', 'b'],则答案返回 'a'
分析
-
分析题目,寻找比目标字母大的最小的一个,简单来说就是找到比他大的第一个字母就行(因为题目说是有序的,我们可以这么思考)
-
第一段我们明确了要干什么,第二段就根据要求选择合适的算法,这里的话,因为是有序的,我们选择二分即可。
-
设置一些结束条件,也就是满足找到对应值之后的返回结果。
3.1 当前值和目标值想等,且存在下一个,下一个和目标值不想等的时候,则返回下一个的值。
3.2 如果最后一个,则自动回去找第一个字符。
3.3 其他情况,默认取二分之后的start值即可。
解答
public class NextGreatestLetter {
public static char nextGreatestLetter(char[] letters, char target) {
int start = 0;
int end =letters.length;
/**
* 二分查找,往大了找。
*/
while (start < end) {
int index = (start + end) / 2;
// 1.计算当前这个index是否符合条件,且不能越界,
if (letters[index] == target && index + 1 < letters.length && letters[index + 1] != target) {
return letters[index + 1];
} else {
if (letters[index] > target) {
end = index;
} else if (letters[index] <= target) {
start = index + 1;
}
}
}
// 如果最后一个,则自动回去找第一个字符
if (letters[letters.length - 1] <= target) {
return letters[0];
}
return letters[start];
}
public static void main(String[] args) {
System.out.println(NextGreatestLetter.nextGreatestLetter(new char[]{'e','e','e','k','q','q','q','v','v','y'}, 'q'));
}
}