2016-03-31 8 views
5

Was ich versuche zu erreichen ist, die Kombination von Alphabeten von einer gegebenen Eingangsnummer zu erhalten. Für z. Wenn ich eine Eingabe von 111 gebe, sollte die Ausgabe ['AAA','KA','AK'] sein. Wenn der Eingang 1111 ist, sollte der Ausgang ['AAAA','KAA','AKA','AAK','KK'] sein. Der Teilarbeits Code ist wie folgt, wo ich ['K','K'] für den Eingang 111 erhalten:Anzeige aller möglichen Kombinationen von Alphabeten aus einem Datensatz für eine gegebene Eingangsnummer

<html> 
<head> 
    <h1>Javascript</h1> 
</head> 
<body> 
    <script> 
     var dataset = 
     {A:'1',B:'2',C:'3',D:'4',E:'5',F:'6',G:'7',H:'8',I:'9', 
     J:'10',K:'11',L:'12',M:'13',N:'14',O:'15',P:'16',Q:'17',R:'18', 
     S:'19',T:'20',U:'21',V:'22',W:'23',X:'24',Y:'25',Z:'26'}; 

     var arr = []; 
     var z; 
     var result = []; 

     var find = function(input){ 
      for(var key in dataset) { 
       if(dataset[key] === input) { 
        return key; 
       } 
      } 
     } 

     var foo = function(x){ 
      z = x.toString(); 

      for(var i=0;i<z.length;i++){ 
       arr.push(z.charAt(i)); 
      } 


      for(var i=0;i<arr.length;i++){ 
       if(arr[i]+arr[i+1] <= 26){ 
        var returnedkey = find(arr[i]+arr[i+1]); 
        result.push(returnedkey); 
       }    
      } 

     } 

     foo(111); 
     console.log(arr); 
     console.log(result); 

    </script> 
</body> 

Ich bin verwirrt, wie weiter verfahren ist und welche die richtige Methode, Vielen Dank im Voraus!

+0

im Zusammenhang mit http://codereview.stackexchange.com/questions/7001/generating-all-combinations-of-an-array – thangngoc89

Antwort

3

Dieser Vorschlag verwendet ein Objekt zum Nachschlagen und eine Wiederholung für die Iteration über die Zeichenfolge.

Beispiel von getCombination('1111') mit dem Aufruf von c()

Ersten iterieren über ein einzelnes Zeichen und dann über zwei Zeichen iterieren, wenn möglich.

left right letter result 
---- ----- ------ ----- 
1111   one 
111 A  one 
    11 AA  one 
    1 AAA one 
     AAAA one AAAA 
    11 AA  one 
     AAK two AAK 
111 A  one 
    1 AK  two 
     AKA one AKA 
    11 K  two 
    1 KA  one 
     KAA one KAA 
    11 K  two 
     KK  two KK 

function getCombination(s) { 
 
    function c(left, right) { 
 
     if (!left) { 
 
      result.push(right); 
 
      return; 
 
     } 
 
     // checks if the first character of left is in the letter object 
 
     // then call c without the first letter of left 
 
     // and right with the letter from the letter object of the first character 
 
     letters[left[0]] && c(left.substring(1), right + letters[left[0]]); 
 

 
     // it is basically the same as above, but with two characters 
 
     left.length > 1 && letters[left.substring(0, 2)] && c(left.substring(2), right + letters[left.substring(0, 2)]); 
 
    } 
 

 
    var letters = { 1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E', 6: 'F', 7: 'G', 8: 'H', 9: 'I', 10: 'J', 11: 'K', 12: 'L', 13: 'M', 14: 'N', 15: 'O', 16: 'P', 17: 'q', 18: 'R', 19: 'S', 20: 'T', 21: 'U', 22: 'V', 23: 'W', 24: 'X', 25: 'Y', 26: 'Z' }, 
 
     result = []; 
 

 
    c(s, ''); 
 
    return result; 
 
} 
 

 
document.write('<pre>' + JSON.stringify(getCombination('1111'), 0, 4) + '</pre>'); 
 
document.write('<pre>' + JSON.stringify(getCombination('1011121314'), 0, 4) + '</pre>');

+0

Was 'Buchstaben tut [ left [0]] && c (leftstring (1), rechts + letters [left [0]]); 'do? Ich meine, ich weiß nicht, was genau das tun wird. Könntest du es bitte erklären? – Apb

+0

Ich habe versucht, die Lösung, es funktioniert wie erwartet, aber ich habe nicht wirklich verstanden, was diese Zeilen tun Buchstaben [links [0]] && c (leftstring (1), rechts + Buchstaben [left [0]]); left.length> 1 && Buchstaben [leftString (0, 2)] && c (leftString (2), rechts + Buchstaben [leftString (0, 2)]); –

+0

this 'letters [left [0]]' cheks, wenn der erste Buchstabe im Objekt ist und wenn ja, 'c' wird mit dem Rest von links und mit einem Buchstaben nach rechts benannt. –

Verwandte Themen