Find maximum possible time HH:MM by permuting four given digits

前端 未结 23 2131
执念已碎
执念已碎 2020-11-30 02:44

I recently took a coding test for a promotion at work. This was one of the tasks I really struggled with and was wondering what is the best way to do this. I used a load of

23条回答
  •  日久生厌
    2020-11-30 03:06

    My approach is to have array of available numbers (stack) and another with return value (ret). At first I put in ret invalid values "-1". Then I sort stack descending and loop trough to try to assign biggest possible number to return stack.

    function swap(a, b, p1, p2) {
      var temp = a[p1];
      a[p1] = b[p2];
      b[p2] = temp;
    }
    
    function t(a, b, c, d) {
      var stack = [a, b, c, d];
      var ret   = [-1, -1, -1, -1];
    
      stack.sort().reverse();
      var change = true;
      var i = 0;
      // this while is assigning HOURS
      while(change === true || i < 4) {
        change = false;
        
        // Assigning at first position (Hh:mm), so number must be lower or equal to 2
        if(stack[i] <= 2 && ret[0] < stack[i]) {
          swap(ret, stack, 0, i);
          change = true;
          i = 0;
        } 
        // Assigning at second position (hH:mm), so number must be <= 4 if number 
        // at first position is 2, otherwise just make sure valid number 
        // (0 to 1) is assigned at first position
        else if(((ret[0] === 2 && stack[i] <= 4) || ret[0] < 2 && ret[0] >= 0) && ret[1] < stack[i]) {
          swap(ret, stack, 1, i);
          change = true;
          i = 0;
        }
        else i++;
      }
      
      stack.sort().reverse();
      change = true;
      i = 0;
      // This while is assigning minutes
      while(change === true || i < 4) {
        change = false;
        
        if(stack[i] <= 5 && ret[2] < stack[i]) {
          swap(ret, stack, 2, i);
          change = true;
          i = 0;
        } 
        else if(stack[i] <= 9 && ret[3] < stack[i]) {
          swap(ret, stack, 3, i);
          change = true;
          i = 0;
        }
        else i++;
      }
      
      // If return stack contains -1, invalid combination was entered
      return Math.min.apply(Math, ret) > -1
        ? ret[0] + "" + ret[1] + ":" + ret[2] + "" + ret[3]
        : "NOT POSSIBLE";
    }
    
    console.log(t(6, 5, 2, 0)); // 20:56
    console.log(t(3, 9, 5, 0)); // 09:53
    console.log(t(2, 5, 6, 8)); // NOT POSSIBLE

提交回复
热议问题