题目:给定一个只包含小写字母的有序数组letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母。
数组里字母的顺序是循环的。举个例子,如果目标字母target = ‘z’ 并且有序数组为 letters = [‘a’, ‘b’],则答案返回 ‘a’。
示例:
输入:
letters = [“c”, “f”, “j”]
target = “a”
输出: “c”
输入:
letters = [“c”, “f”, “j”]
target = “c”
输出: “f”
输入:
letters = [“c”, “f”, “j”]
target = “d”
输出: “f”
输入:
letters = [“c”, “f”, “j”]
target = “g”
输出: “j”
输入:
letters = [“c”, “f”, “j”]
target = “j”
输出: “c”
输入:
letters = [“c”, “f”, “j”]
target = “k”
输出: “c”
注:
letters长度范围在[2, 10000]区间内。
letters 仅由小写字母组成,最少包含两个不同的字母。
目标字母target 是一个小写字母。
package com.ljq.fenzhi;
import java.util.Scanner;
/**
* @author 作者 Your-Name:
* @version 创建时间:2019年8月28日 下午5:13:58
* 类说明
*/
public class NextLetter {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
char[] letters = scanner.nextLine().toCharArray();
char target = scanner.nextLine().charAt(0);
char ret = nextGreatestLetter(letters,target);
System.out.println(ret);
}
scanner.close();
}
public static char nextGreatestLetter(char[] letters,char target) {
int n = letters.length;
int l=0,h=letters.length-1;
while(l<=h) {
int m = l+(h-l)/2;
if(letters[m]<=target) {
l = m+1;
}else {
h = m-1;
}
}
/*
* 解决循环问题
*/
return l<n?letters[l]:letters[0];
}
}