2017-07-31 3 views
1

与えられた4桁から最大有効時間を見つけようとしています。私は数字(2,4,0,0)を使用しています。コードは20:42を返しますが、コードは20:40を返します。 これにどう対処するか提案してください。4桁からの最大有効時間

import java.util.ArrayList; 
import java.util.List; 

public class MaxTimeCombination { 
public static void main(String[] args) { 

    System.out.println(solution(2, 4, 0, 0)); 
    System.out.println(solution(3, 0, 7, 0)); 
} 

public static String solution(int A, int B, int C, int D) { 
    // brute force permutation 
    int[] temp = new int[] {A, B, C, D}; 

    List<List<Integer>> permutation = permute(temp); 
    int h = Integer.MIN_VALUE; 
    int m = Integer.MIN_VALUE; 
    boolean exists = false; 

    /*  System.out.println("Permutations:" + permutation); 
    for (int i = 0; i < permutation.size(); i++) { 
    if (permutation.get(i).get(0) > 0 && permutation.get(i).get(0) < 3){ 
     List <Integer> output = permutation.get(i); 
     System.out.println(output);  
    } 

    }*/ 


    for (int i = 0; i < permutation.size(); i++) { 
     //if (permutation.get(i).get(0) > 0 && permutation.get(i).get(0) < 3){ 
     List<Integer> k = permutation.get(i); 
     //System.out.println("Sorted :" + k); 
     int hh = k.get(0)*10 + k.get(1); 
     if (hh < 24) { 
      exists = true; 
      if (hh > h) { 
       h = hh; 
      } 
     } 
     int mm = k.get(2)*10 + k.get(3); 

     if (mm < 60) { 
      exists = true; 
      if (mm > m) { 
       m = mm; 
      } 
     } 
    } 

    return (exists ? String.format("%02d:%02d", h, m) : "NOT POSSIBLE"); 
} 

public static List<List<Integer>> permute(int[] num) { 
    List<List<Integer>> result = new ArrayList<>(); 

    //start from an empty list 
    result.add(new ArrayList<>()); 

    for (int i = 0; i < num.length; i++) { 
     //list of list in current iteration of the array num 
     List<List<Integer>> current = new ArrayList<>(); 

     for (List<Integer> l : result) { 
      // # of locations to insert is largest index + 1 
      for (int j = 0; j < l.size()+1; j++) { 
       // + add num[i] to different locations 
       l.add(j, num[i]); 

       List<Integer> temp = new ArrayList<>(l); 
       current.add(temp); 

       //System.out.print(temp + " "); 

       //l.remove(num[i]); 
       l.remove(j); 
      } 

     } 

     result = new ArrayList<>(current); 
    } 

    return result; 
} 
} 
+0

正しい答えが返ってきているようです。有効な最大値は20:42ではなく20:42であることを具体的に教えてください。/ –

+0

入力した4番目の数字が@ZainUlAbidinに使用されないためです。 2をもう一度表示したくない場合は、一度使用した後でブラックリストに入れることができます。 – Nico

+0

出力形式を知っているので、ちょうど4桁です。だから、なぜ入力を4桁の整数に組み合わせるのですか?>残りの部分に2桁目の<= 23を持つ最大整数をフィルタしてください。<= 59 =>時間にフォーマットしてください。 –

答えて

0

hとm maxのテストを再構成する必要があります。あなたの現在のコードはそれぞれ独立して最大値を探します。あなたが得ているのは、20:42のように、順列で一緒に出現しなかった時でさえ、最高の時間と最大の分です。

ここには、テストの作業バージョンがあります。 hh>hhh>=hなったこと

int hh = k.get(0) * 10 + k.get(1);   
if (hh < 24) 
{ 
    if (hh >= h) 
    { 
     int mm = k.get(2) * 10 + k.get(3); 
     if (mm < 60) 
     { 
      exists = true; 
      if (hh > h || mm > m) 
      { 
       m = mm; 
      } 
      h = hh; 
     } 
    } 
} 

は注意してください。たとえ時間が私たちが見たものと同じであっても、最大の分を探す必要があります。 max minuteをチェックするコードは、時間テストのif節内で移動されています。私たちが検討している分が最大の時間に関連付けられていることを確認する必要があります。 20:40

0

私はあなたがこの問題のためにoverthinkingていると思う:最後に、あなたのコードは、期待値を与える変更、これによりhh>h

を、私たちは、最大分mm>mを更新する必要があるか、我々は新しい最大時間を持っています。次のように実際の解決策を見つけてください:

import java.util.ArrayList; 
import java.util.Collections; 

public class TestClass{ 

    public static void main(String[] args) 
    { 
     int maxLimits[] = {2, 3, 5, 9}; 

     ArrayList<Integer> list = new ArrayList<>();  
     list.add(3); 
     list.add(2); 
     list.add(9); 
     list.add(2); 

     Collections.sort(list); 
     int time[] = new int[4]; 

     for(int i = 0; i<4; i++) 
     { 
      int index = 0; 
      for(int j=0; j<list.size(); j++) 
      { 

       if (list.get(j) <= maxLimits[i]) 
       { 
        time[i] = list.get(j); 
        index = j; 
       } 
      } 

      list.remove(index); 
     } 
    } 
} 

希望します。 :-)

関連する問題