2011-12-21 11 views
10

एन प्रतीकों, एक आकार के, और प्रतीक सेट से गैर-दोहराने वाले वर्णों की लंबाई के संयोजन को देखते हुए, अगले उच्चतम अद्वितीय मुद्रित करने के लिए केवल एक इटारेटिव एल्गोरिदम लिखें संख्या बनाई जा सकती है।दिए गए अंकों से अगले उच्चतम अद्वितीय संख्या

पूर्व:

Symbols =[1,2,3,4,5] 
size = 3; 
given combination = 123, result = 124 
given combination = 254, result = 312 
+5

अच्छे साक्षात्कारकर्ता बता सकते हैं कि क्या इन चीजों के लिए डिब्बाबंद प्रतिक्रिया है या नहीं। अगर आपको इसे काम करना है तो वे इसे बेहतर पसंद करते हैं, क्योंकि वे आपकी समस्या सुलझाने की प्रक्रिया देख सकते हैं, जो समाधान को जानने से ज्यादा महत्वपूर्ण है। – Almo

+0

मैंने इस तरह का समाधान दिया, उपलब्ध संख्याओं की एक क्रमबद्ध डबल एंडेड कतार लें, उपलब्ध संख्याओं के साथ शुरू करें, 1. इकाइयों के अंकों से शुरू करें, यदि उच्च संख्या उपलब्ध है, तो जांचें, यदि अन्यथा प्रतिस्थापित करें, तो इस नंबर को उपलब्ध सूची में रखें और दस अंकों के अंकों की जांच करें 2. यदि आपको वर्तमान अंक से अधिक संख्या मिलती है तो इसे प्रतिस्थापित करें, और कतार से छोटी संख्या डालने शुरू करें। क्या इसे और अधिक कुशल बनाया जा सकता है और क्या कोई त्रुटियां हैं? –

+0

उदाहरण .. {{{ 123 उपलब्ध: 45 जांच 3 .. 254 उपलब्ध के लिए 4 के साथ बदलें: 13 जांच 4 .. 1,3 <4 उपलब्ध जांच 5 में 4 डाल .. उपलब्ध नहीं जांच 2 .. उपलब्ध: 1345 उपलब्ध 2 में सम्मिलित करें, 3 के साथ प्रतिस्थापित करें, 1 और 2 }}} –

उत्तर

2

यहाँ यह करने के लिए एक स्यूडोकोड एल्गोरिथ्म है:

int n = length(Symbols); 
int k = length(A); 
// TRACK WHICH LETTERS ARE STILL AVAILABLE 
available = sort(Symbols minus A); 
// SEARCH BACKWARDS FOR AN ENTRY THAT CAN BE INCREASED 
for (int i=k-1; i>=0; --i) { 
    // LOOK FOR NEXT SMALLEST AVAILABLE LETTER 
    for (int j=0; j<n-k; ++j) { 
     if (A[i] < available[j]) { 
      break; 
     } 
    } 
    if (j < n-k) { 
     // CHANGE A[i] TO THAT, REMOVE IT FROM AVAILABLE 
     int tmp = A[i]; 
     A[i] = available[j]; 
     available[j] = tmp; 
     // RESET SUBSEQUENT ENTRIES TO SMALLEST AVAILABLE 
     for (j=i+1; i<k; ++j) { 
      A[j] = available[i+1-j]; 
     } 
     return A; 
    } else { 
     // A[i] MUST BE LARGER THAN AVAILABLE, SO APPEND TO END 
     available = append(available,A[i]); 
    } 
} 
+0

मैंने वही जवाब दिया! .. साक्षात्कारकर्ता ने कहा कि मैं इसे और अधिक अनुकूलित कर सकता हूं !!! मेरी पोस्ट पर टिप्पणी देखें। कोड के लिए –

0

इस विधि आज़माएं:

public int nextCombo(int[] symbols, int combo, int size) { 
    String nc = ""; 
    symbols = java.util.Arrays.sort(symbols); 
    for (int i = 0; i < size; i++) nc += Integer.toString(symbols[symbols.length - 1]); 
    if (Integer.parseInt(nc) == combo) return combo; //provided combo is the largest possible so end the method 
    nc = ""; 
    int newCombo = 0; 
    while (newCombo < combo) { //repeat this process until the new combination is greater than the provided one 
     for (int i = 0; i < size; i++) { //keep appending numbers from the symbol array onto the new combo until the size limit is reached 
      nc += Integer.toString(symbols[(int) Math.floor(Math.random() * size)]); 
     } 
     newCombo = Integer.parseInt(nc); 
    } 
    return newCombo; 
} 
2
public class IncrementSybmols { 
    public static void main(String[] args) throws Throwable { 
     List<Integer> syms = Arrays.asList(1,2,3,4,5); 

     test(syms, 3, Arrays.asList(1,2,3), Arrays.asList(1,2,4)); 
     test(syms, 3, Arrays.asList(2,5,4), Arrays.asList(3,1,2)); 

     test(syms, 3, Arrays.asList(4,3,5), Arrays.asList(4,5,1)); 
     test(syms, 3, Arrays.asList(5,4,2), Arrays.asList(5,4,3)); 
     test(syms, 3, Arrays.asList(5,4,3), null); 
    } 

    private static void test(List<Integer> syms, int n, List<Integer> in, List<Integer> exp) { 
     List<Integer> out = increment(syms, n, in); 
     System.out.println(in+" -> "+out+": "+(exp==out || exp.equals(out)?"OK":"FAIL")); 
    } 

    private static List<Integer> increment(List<Integer> allSyms, int n, List<Integer> in){ 
     TreeSet<Integer> availableSym = new TreeSet<Integer>(allSyms); 
     availableSym.removeAll(in); 

     LinkedList<Integer> current = new LinkedList<Integer>(in); 

     // Remove symbols beginning from the tail until a better/greater symbols is available. 
     while(!current.isEmpty()){ 
      Integer last = current.removeLast(); 
      availableSym.add(last); 

      // look for greater symbols 
      Integer next = availableSym.higher(last); 
      if(next != null){ 
       // if there is a greater symbols, append it 
       current.add(next); 
       availableSym.remove(next); 
       break; 
      } 
     } 

     // if there no greater symbol, then *shrug* there is no greater number 
     if(current.isEmpty()) 
      return null; 

     // fill up with smallest symbols again 
     while(current.size() < n){ 
      Integer next = availableSym.first(); 
      availableSym.remove(next); 
      current.add(next); 
     } 

     return current; 
    } 
} 
+0

धन्यवाद! –

2

जब आप पुनरावृत्ति कर रहे हैं (पीछे की ओर) अंकों के दौरान आपको सबसे कम जांचना नहीं है हर बार उपलब्ध है, इसके बजाय आप मौजूदा बनाम आखिरी चेक किए गए अंकों की जांच कर सकते हैं, यदि यह कम है, तो मौजूदा को जोड़ते समय अगले अंक पर जाएं, यदि यह अधिक है तो सबसे कम (वर्तमान से अधिक) को खोजने के लिए उपलब्ध जांचें संभव है और कतार से सबसे कम के साथ बाकी में भरें।

i.e. 254 

current = 4  // 4 < 1,3 so no higher available 
last_checked = 4 // available = {1, 3, 4} 
current = 5  // 4 < 5 so no higher available 
last_checked = 5 // available = {1, 3, 4, 5} 
current = 2  // 5 > 2 so search available for lowest possible(higher than 2) = 3 
set 3,_,_  // Then just add lowest elements until full: 3,1,2 = 312 

इस तरह आपको केवल एक बार उपलब्ध प्रतीकों को देखना होगा, और आप केवल अधिकांश के समय की तुलना कर रहे हैं।

संबंधित मुद्दे