我的数字为x,y,z和w。 我试图以24小时格式创建最大可能时间。 例如:
我的方法是对所有数字进行排序。然后几个小时检查小于等于2的数字,然后检查小时的下一个数字,检查小于等于4的数字, 等等几分钟。 (0-60分钟)
除了暴力解决方案之外还有其他任何有效的方法吗?
答案 0 :(得分:4)
简单的方法是创建四位数的所有数字的所有可能组合。然后排序并挑选出小于2359的所有值(允许的最大时间)。在此之后,您从最大数字开始,如果没有检查下一个最大数字,只需验证它是否是正确的时间。
答案 1 :(得分:3)
基本上你可以做的不是所有的排列,而是为数组中的每个值创建条件。例如,如果我们有一个2,我们知道我们的十个小时的小时应该是2,但我们那小时的小时点在这一点上只能是3。如果我们有一个1然后我们知道我们的小时的一个点可以是9.我们知道我们的十分钟点是5而我们的最大分钟一个点是9. createTime显示这些条件。如果findMaxSpecific无法在给定数组中找到有效数字,则返回-1。这样我们就知道如果我们得到一个带有-1的createTime返回的数组,那么时间就是无效的。参见示例输出。
library(dplyr)
df %>% select(ClaimDay, day) %>%
group_by(day) %>%
mutate(ClaimDay.count = n()) %>%
slice(1)
最后,如果任何值返回为-1,我们知道我们的时间无效
实施例
public static int[] createTime(int[] numbers)
{
int[] time = new int[4];
time[0] = findMaxSpecific(numbers, 2);
time[1] = time[0] == 2 ? findMaxSpecific(numbers, 3) : findMaxSpecific(numbers, 9);
time[2] = findMaxSpecific(numbers, 5);
time[3] = findMaxSpecific(numbers, 9);
return time;
}
public static int findMaxSpecific(int[] arr, int valToFind)
{
if(arr.length != 4)
return -1;
int numToFind = -1;
int indexToRemove = -1;
for(int i = 0; i < arr.length; i++)
{
if(arr[i] <= valToFind)
{
if(arr[i] > numToFind)
{
numToFind = arr[i];
indexToRemove = i;
}
}
}
if(indexToRemove == -1)
return -1;
arr[indexToRemove] = -1;
return numToFind;
}
输出
int[] time = new int[4];
int[] numbers = {1,2,3,4};
time = createTime(numbers);
System.out.println(time[0] + "" + time[1] + ":" + time[2] + "" + time[3]);
int[] numbers2 = {0,9,7,1};
time = new int[4];
time = createTime(numbers2);
System.out.println(time[0] + "" + time[1] + ":" + time[2] + "" + time[3]);
int[] numbers3 = {9,9,9,9};
time = new int[4];
time = createTime(numbers3);
System.out.println(time[0] + "" + time[1] + ":" + time[2] + "" + time[3]);
答案 2 :(得分:2)
对于输入1 2 9 9
,唯一的可能性是19:29
,但您描述的内容首先选择两个并获取21:99
,这是一个无效的时间。
除非这确实是瓶颈而不是编程练习,否则最直接的解决方案是尝试所有可能的数字排列,对于每个数字,检查它是否构成有效时间,并采用字典编码最大有效字符串。 / p>
重点是,有快速的解决方案,并有正确的解决方案。 在这里,快速解决方案很棘手,因此如果程序运行时间不重要,请考虑选择较慢但更明显的解决方案的可能性。 作为一名程序员,这可能会让你有更多的时间来解决运行时间很重要的其他问题。
可悲的是,Java似乎没有提供内置的nextPermutation方法,而是Stackoverflow sure does。
答案 3 :(得分:1)
input = (1,2,3,4)
ans = None
for hour in range(0, 24):
for minute in range(0,60):
if possible(hour, minute, input):
ans = "%s:%s" % (hour, minute)
此处您的possible
函数应计算小时,分钟和输入中的数字,并确保它们等同。
答案 4 :(得分:0)
我会有一个方法,你可以给出一个谓词,它提取与谓词匹配的最高值。
e.g。
public static int highest(List<Integer> values, Predicate<Integer> test) {
Integer max = values.stream()
.filter(test)
.max(Comparator.natrualOrder())
.orElseThrow(() -> new InvalidStateException());
values.remove(max);
return max;
}
int digit1 = highest(list, i -> i < 3);
int digit3 = highest(list, i -> i < 6);
int digit2 = highest(list, i -> digit1 < 2 || i < 4);
int digit4 = highest(list, i -> true);
答案 5 :(得分:0)
有趣的问题。似乎比它看起来更复杂一些。这是问题的python脚本。
def getmin(num): # check if two digits are valid for minutes
min = -1
sum = num[0] * 10 + num[1]
if sum < 60:
min = sum
sum = num[1] * 10 + num[0]
if sum < 60 and min < sum:
min = sum
return min
def maxtime(num):
hour = -1
min = -1
h1 = 0
h2 = 0
for i in range(4):
for j in range(4): # these two loops are to get maxi hour, if possible
if i != j:
sum = num[i] * 10 + num[j]
if hour < sum and sum < 24:
c = num[:] # get a copy of input digits
if i > j: # delete numbers used in hour
del c[i]
del c[j]
else:
del c[j]
del c[i]
if getmin(c) > -1:
h1 = i
h2 = j
hour = sum
if hour > -1:
if h2 > h1: # delete numbers used in hour
del num[h2]
del num[h1]
else:
del num[h1]
del num[h2]
min = getmin(num)
if min > -1:
print(str(hour) + ':' + str(min))
if hour < 0 or min < 0:
print("no solution")
maxtime([4, 8, 1, 9])
maxtime([7, 3, 4, 2])
maxtime([9, 2, 2, 5])
maxtime([9, 2, 7, 3])
#19:48
#23:47
#22:59
#no solution