从4个整数的列表中生成最大HH:MM

时间:2016-10-22 19:45:21

标签: algorithm sorting

注意:另一个问题是这一个的重复。如果我比这个问题提前6个月发布这个问题,那我的怎么可能是重复的?

我有4个非负整数a,b,c,d。所有这些都小于或等于9.我必须以24小时格式返回时钟上显示的最长时间。

例如:a = 9,b = 4,c = 3,d = 1,将产生19:43

到目前为止,我只能用蛮力的方法来测试所有24种可能的组合。虽然这不是太糟糕,但我想知道是否有更优雅的方法。所有的想法都比蛮力更好。

注意:这不是一个家庭作业问题。我从面试准备网站得到了这个,但那里没有解决方案。

3 个答案:

答案 0 :(得分:2)

生成所有24种排列都可行,但您不必这样做。您对蛮力方法的验证需要您验证每个数字,并且您可以在验证每个数字时建立排列。从大数字开始。

  1. 排序数字高 - >低
  2. 遍历每个数字[i]并搜索列表,直到找到符合要求的最高数字。

    [0]必须<= 2

    如果[0] == 2

    [1]必须是&lt; = 3

    [2]必须<= 5

    [3]可以是任何东西

  3. 从列表中删除该号码,并将其置于[i]

  4. 的位置
  5. 重复每个数字

  6. 这些条件中的每一个都可以在列表中表示为lambda函数,从而可以轻松地将搜索循环与条件分开。

答案 1 :(得分:1)

关键是对数据进行排序,然后应用这些简单的规则:

  • 至少一个元素必须<= 2
  • 第二个元素必须是<= 5
  • 如果只有两个元素符合前两个规则,那么其中一个必须是&lt; 2
  • 如果为第一个值选择的元素为2,则为第二个值选择的元素必须小于4

使用三个计数器很容易实现这些规则:

  • less_than_3 - 这必须始终至少为1
  • less_than_6 - 这必须始终至少为2
  • less_than_4 - 如果a == 2则less_than_4必须至少为2

这是一个可以进一步重构的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;
        }
    }