注意:另一个问题是这一个的重复。如果我比这个问题提前6个月发布这个问题,那我的怎么可能是重复的?
我有4个非负整数a,b,c,d。所有这些都小于或等于9.我必须以24小时格式返回时钟上显示的最长时间。
例如:a = 9,b = 4,c = 3,d = 1,将产生19:43
到目前为止,我只能用蛮力的方法来测试所有24种可能的组合。虽然这不是太糟糕,但我想知道是否有更优雅的方法。所有的想法都比蛮力更好。
注意:这不是一个家庭作业问题。我从面试准备网站得到了这个,但那里没有解决方案。
答案 0 :(得分:2)
生成所有24种排列都可行,但您不必这样做。您对蛮力方法的验证需要您验证每个数字,并且您可以在验证每个数字时建立排列。从大数字开始。
遍历每个数字[i]并搜索列表,直到找到符合要求的最高数字。
[0]必须<= 2
如果[0] == 2 ,[1]必须是&lt; = 3
[2]必须<= 5
[3]可以是任何东西
从列表中删除该号码,并将其置于[i]
重复每个数字
这些条件中的每一个都可以在列表中表示为lambda函数,从而可以轻松地将搜索循环与条件分开。
答案 1 :(得分:1)
关键是对数据进行排序,然后应用这些简单的规则:
使用三个计数器很容易实现这些规则:
这是一个可以进一步重构的JavaScript解决方案。
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
diff = arr[j] - arr[i];
if (ndiff == diff) {
pair[x] = arr[i];
x++;
pair[x] = arr[j];
x++;
}
}
}
for(i=0;i!=pair.length;i++){
System.out.print(pair[i]+" ");
}
答案 2 :(得分:1)
您可以将时间更改为分钟。 然后你可以比较它。
// 23:59 ==&gt; 23 * 60 + 59 == 1439分钟 //(10A + B)* 60 +(10C + d)&LT; = 1439
这是我的代码。
String function(int[] numbers){
int num[] = numbers;
int temp = 0;
int cnt=0;
int numA=0;
int numB=0;
int numC=0;
int numD=0;
for(int a=0;a<num.length; a++){
for(int b=0;b<num.length; b++){
for(int c=0;c<num.length; c++){
for(int d=0;d<num.length; d++){
if(a!=b && a!=c && a!=d
&& b!=c && b!=d
&& c!=d){
if((10*num[c]+num[d])<60) {
int cal = (10 * num[a] + num[b]) * 60 + (10 * num[c] + num[d]);
Log.d("Joon1979", "Input Numbers [ " + num[a] + ", " + num[b] + ", " + num[c] + ", " + num[d] + " ]");
if (cal <= 1439) {
cnt++;
if (temp < cal) {
temp = cal;
numA = num[a];
numB = num[b];
numC = num[c];
numD = num[d];
}
}
}
}
}
}
}
}
if(cnt==0){
return "impossible";
}else {
return numA+""+numB+" : "+numC+""+numD;
}
}