【问题标题】:Display maximum military time from given four integers [duplicate]显示给定四个整数的最大军事时间[重复]
【发布时间】: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


【解决方案1】:

我的解决方案:)

function getMaxTime(a,b,c,d) {

let nums = Array.from(arguments).sort();

function getMaxNum (num, arr) {    
  let index ;
   arr.map(function(el, i){     

        if( el <= num ) { index = i }                  
  });

  return index 
} 

function extractVal (index, arr) {
   if(index) { return arr.splice(index, 1) }
}


//first condition

  if ( getMaxNum(2, nums) <= 2 ){
     let value1 =  extractVal(getMaxNum(2, nums), nums);        

      if (value1 == 2){
       if (getMaxNum(3, nums) <= 3){

         let value2 = extractVal(getMaxNum(3, nums), nums)         
         let value3 = extractVal(getMaxNum(5, nums), nums)     
         let value4 = extractVal(getMaxNum(9, nums), nums)
         console.log(value1, value2, value3, value4)
       }else{
          console.log( 'Cannot build an time hour from 2' )
       }

    }else{
      let value2 =  extractVal(getMaxNum(9, nums), nums)
      let value3 =  extractVal(getMaxNum(5, nums), nums)   
      let value4 =  extractVal(getMaxNum(9, nums), nums)

      console.log(value1, value2, value3, value4)
    }

  }else{
    console.log( 'Cannot build an time hour' )
  }

}

getMaxTime(0,0,3,5)

【讨论】:

    【解决方案2】:

    和我的朋友我们几个小时都在考虑这个问题,IMO 最好的解决方案是从 i = 2359 迭代,将 i 数除以单独的数字,排序并最后检查是否等于输入数字的排序数组。此外,如果 i%100 == 0 从 i 中减去 41,以避免分钟大于 60 的数字。完整、经过测试的实现如下:

    public String solution(int A, int B, int C, int D) {
    
        int[] inputNumbers = { A, B, C, D };
        Arrays.sort(inputNumbers);
    
        for (int i = 2359; i >= 0; i--) {
    
            if (i % 100 == 0 && i != 0) {
                i -= 41;
            }
            StringBuilder potentialTimeNumbers = new StringBuilder(i + "");
    
            for (int k = potentialTimeNumbers.length(); k < 4; k++) {
                potentialTimeNumbers.insert(0, "0");
            }
    
            int[] iNumbers = Stream.of(potentialTimeNumbers.toString().split("")).
                    mapToInt(Integer::parseInt).toArray();
            Arrays.sort(iNumbers);
    
            if (Arrays.equals(inputNumbers, iNumbers)) {
                return potentialTimeNumbers.insert(2, ":").toString();
            }
    
        }
        return "NOT VALID";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-21
      • 1970-01-01
      相关资源
      最近更新 更多