最近我在考试中遇到了一个问题。我将给出一个数组的4个数字和使用,我必须构建最大可能的24小时时间格式。例如:如果输入数组是[1,3,5,2],那么答案将是"23:51"。如果输入数组为[1,1,5,0],那么答案将是"15:10"。
我试过了,确实成功了,但它非常初级。我基本上必须为每个时间位置创建4个不同的数组,并与输入数组进行比较。
在任何语言(c, c#, objC或其他任何语言)中使用不同的方法实现将会有很大的帮助。我似乎无法理解我的逻辑。只是想分享一个可行的解决方案。未必有效。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test {
public static void main(String[] args) throws Exception {
int[] input = {1,2,6,7};
System.out.println(getLargestTime(input)+" is the largest time!");
}
public static String getLargestTime(int[] input) {
String largestTime = "00:00";
String str = input[0]+""+input[1]+""+input[2]+""+input[3];
List<String> times = new ArrayList<>();
permutation(str, times);
Collections.sort(times, Collections.reverseOrder());
for (String t: times) {
int hours = Integer.parseInt(t) / 100;
int minutes = Integer.parseInt(t) % 100;
if (hours < 24 && minutes < 60) {
if (hours < 10 && minutes < 10) {
largestTime = "0"+hours+":0"+minutes;
} else if (hours < 10) {
largestTime = "0"+hours+":"+minutes;
} else if (minutes < 10) {
largestTime = hours+":0"+minutes;
} else {
largestTime = hours+":"+minutes;
}
}
}
return largestTime;
}
public static void permutation(String str, List<String> list) {
permutation("", str, list);
}
private static void permutation(String prefix, String str, List<String> list) {
int n = str.length();
if (n == 0) list.add(prefix);
else {
for (int i = 0; i < n; i++)
permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n), list);
}
}
}
- 查找最大数
- 如果该数字是合法的,则将其放在前面(0,1或2在第一个位置)。如果不是,找到最大的合法数字并把它放在第一位。
- 重复1-2,以第二个,第三个等最大的数字,直到找到一个合法的号码为前面
- 依次重复1-3
- 如果最后得到非法数字,那么将这些非法数字与产生最新时间的较早的数字交换。
由于只有4个数字,我将生成所有可能的时间戳(即4!
即24
),对它们进行排序,并找到最大的有效时间戳。
如何查看t
是否为有效的24小时时间戳?
-
t
为最大4位,即t mod 10000 == 0
- 最后两位数字(
t mod 100
)是有效的分钟值,即在[0-59]
范围内 - 前两位数字(
t div 100
)是有效的小时值,即在[0-23]
范围内。
这不是完整的答案,只是@arun的补充部分。为了检查有效的时间戳,我假设时间戳的形式是ab:cd,其中a, b, c, d是数字。
-
a的取值范围为0 ~ 2
-
如果a小于2,则b全部有效。否则,b取值范围为0 ~ 3
-
c的取值范围应为0 ~ 5
-
d都有效
你可以使用这些约束:
- 检查生成后的有效时间戳或
- 使用它们生成