【发布时间】:2017-01-16 21:45:39
【问题描述】:
我在一次面试挑战中遇到了这个问题。
问题是给定四个整数,以 24 小时格式 HH:MM 显示可能的最长时间。例如,如果您给出 A = 1、B = 9、C = 9、D = 2,则输出应为 19:29。最大时间可以是 23:59,最小时间可以是 00:00。如果无法构造 24 小时时间,则返回错误。例如,给定 A = 1, B = 9, C = 7, D = 9 应返回错误,因为这些整数表示的最小时间是 17:99,这是无效的。
我最初的方法是找到给定数字的所有 24 个整数排列,然后消除所有大于 2400 的整数。之后,消除所有最后两位数超过 59 的整数。即 5 位在十位,9 位在单位位。过滤后,返回结果集中剩下的最大整数。
这种方法在这里是可行的,因为我们只需计算 24 个排列,甚至更少的组合,因为重复项将被删除。但我觉得这是一种蛮力的方法。还有其他不需要我们生成所有排列的想法吗?
同样作为这个问题的扩展,如果我们被要求将时间延长到秒或毫秒,分别给出总共 6 位或 8 位,那么我的方法将是昂贵的。让我们假设最大允许的运行时间复杂度可以是 O(nlogn),从而允许我们进行排序。另外,如何检查我上面提到的边缘情况?
谢谢。
编辑:以下是 cmets 中建议的答案的代码。
//Input arraylist contains the four integers
public static String maxTime(ArrayList<Integer> list){
int first = -1;
int second = -1;
int third = -1;
int fourth = -1;
for (int a : list) {
if (a <= 2 && a > first) {
first = a;
}
}
list.remove(Integer.valueOf(first));
for (int a : list) {
if (first == 2 && a <= 3 && a > second) {
second = a;
}
}
if (second == -1) {
for (int a : list) {
if (a > second) {
second = a;
}
}
}
list.remove(Integer.valueOf(second));
for (int a : list) {
if (a <= 5 && a > third) {
third = a;
}
}
list.remove(Integer.valueOf(third));
fourth = list.get(0);
StringBuilder sb = new StringBuilder(5);
sb.append(first);
sb.append(second);
sb.append(':');
sb.append(third);
sb.append(fourth);
return sb.toString();
}
【问题讨论】:
-
我已经浏览了那个问题链接,但没有任何令人满意的答案。请看一下。
-
链接的问题有一个很好的答案。我看过了。只需执行它。如果您对此有疑问,请发布您的代码并就问题所在提出具体问题。
-
实现了。仍然没有给出想要的输出。显然,我在问题中提到的检查输入有效性的极端情况是不正确的。因此,即使是答案中指出的边缘情况也丢失了。已经用代码更新了我的问题。
标签: algorithm sorting time big-o