每日算法(4):6个数找最大时间
题目
给定一个数组,里面有6个整数,求这个数组能够表示的最大24进制的时间是多少, 输出这个时间,无法表示输出invalid
输入:输入为一个整数数组,数组内有6个整数
输入整数数组长度为6,不需要考虑其它长度,元素值为0或者正整数,
6个数字每个数字只能使用一次。
输出:输出为一个24进账格式的时间,或者字符串“invalid”
示例输入:[0,2,3,0,5,6]
示例输出: 23:56:00
代码
public class GetMaxDateByArray {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 循环连续读取
while (sc.hasNext()) {
String line = sc.nextLine();
System.out.println(getResult(line));
}
}
/**
* 解题思路: 时间格式第一位不能大于2,第二位不能大于3等
* 所以从头开始,一位一位找,先找满足第一位的集合中的数字,然后找出最大的一个,
* 碰到任何不满足条件的直接返回 invalid,满足则从数组从移除,以此类推
* 这里注意一点,list.remove 有两个重载方法,如果是int集合,按照元素删除,必须是包装类,即 Integer.valueOf, 否则会按照索引删除,会有问题
*/
private static String getResult(String line) {
final String s = "invalid";
final String c = ":";
String[] strArray = line.split(",");
// 转换为数组,放入集合
List<Integer> list = Arrays.stream(strArray).map(Integer::parseInt).collect(Collectors.toList());
StringBuilder result = new StringBuilder();
//第一位不能大于3,获取数组中小于3的数字中最大的一个
int data1 = getDataOfLocation(list, 3);
if (data1 != -1) {
list.remove(Integer.valueOf(data1));
result.append(data1);
} else {
return s;
}
//如果第一位是2,那么第二位则不能超过4
if (result.charAt(0) == '2') {
//第二位
int data2 = getDataOfLocation(list, 4);
if (data2 != -1) {
// 按照元素删除
list.remove(Integer.valueOf(data2));
result.append(data2);
result.append(c);
} else {
return s;
}
// 否则,第一位可能是0或者1,这样第二位可以是0-9,即小于10
} else {
//第二位
int data3 = getDataOfLocation(list, 10);
if (data3 != -1) {
list.remove(data3);
result.append(data3);
result.append(c);
} else {
return s;
}
}
//第三位,分钟最大是59,即小于6
int data4 = getDataOfLocation(list, 6);
if (data4 != -1) {
list.remove(Integer.valueOf(data4));
result.append(data4);
} else {
return s;
}
//第四位,0-9
int data5 = getDataOfLocation(list, 10);
if (data5 != -1) {
list.remove(Integer.valueOf(data5));
result.append(data5);
result.append(c);
} else {
return s;
}
//第五位
int data6 = getDataOfLocation(list, 6);
if (data6 != -1) {
list.remove(Integer.valueOf(data6));
result.append(data6);
} else {
return s;
}
//最后一位
if (getDataOfLocation(list, 10) != -1) {
result.append(getDataOfLocation(list, 10));
} else {
return s;
}
return result.toString();
}
/**
* 获取数组中比 standard 小的数字中最大的一个数,没有返回-1
*/
static int getDataOfLocation(List<Integer> list, int standard) {
return list.stream().filter(x -> x < standard).mapToInt(x -> x).max().orElse(-1);
}
}