2017-07-31 35 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:40而不是20:42:/ –

+0

我猜是因爲第四次輸入數字將不會被使用然後@ZainUlAbidin。如果你不想讓2,再次出現,你可以在使用一次後將其列入黑名單。 – Nico

+0

因爲您知道輸出格式,只需要4位數字。那麼,爲什麼你不把輸入結合到4位數的整數中=>具有2個第一個數字<= 23的過濾器最大整數,其餘部分爲<= 59 =>格式化爲時間。 –

回答

0

您需要重新構造h和m max的測試。您當前的代碼會獨立查找每個代碼的最大值。你得到的是與最大分鐘一起的最大時間,即使它們不是以一種排列組合在一起發生,就像20:42一樣。

這是測試的工作版本。

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; 
     } 
    } 
} 

注意hh>h已成爲hh>=h。即使這個小時與我們之前見過的時間相等,我們仍然需要尋找最大的分鐘。檢查最大分鐘的代碼已在小時測試的if子句中移動。我們需要確保我們正在考慮的時間與最長時間有關。最後,我們需要更新的最大分鐘時,mm>m或者我們有一個新的最大小時,hh>h

有了這個改變你的代碼給出的預期值:20:40

0

我想你對得太多這個問題。請找到工作解決方案如下:

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); 
     } 
    } 
} 

希望這會有所幫助。 :-)