2017-01-14 8 views
2

によってキュー復興だからここで質問です:406(LeetCode)。身長

https://leetcode.com/problems/queue-reconstruction-by-height/

あなたはキューに立って人々のランダムなリストを持っていると仮定します。それぞれの人は整数の組(h、k)で記述され、hは人物の高さ、kは高さh以上の人物の人数です。キューを再構築するアルゴリズムを作成します。

注: 人数は1,100人未満です。

例:

Input: 
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]] 

Output: 
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]] 

そして、ここには私の答えはJavaScriptを使用している:

var reconstructQueue = function(people) { 
var result= []; 
people.sort((a,b)=>a[1]-b[1]).sort((a,b)=>b[0]-a[0]); 
for(var i=0; i<people.length; i++) { 
    result.splice(people[i][1], 0, people[i]); 
} 
return result; 
}; 

これは、上記の試験に合格することができますが、なぜそれがLeetcodeのすべてのテストに合格しませんでしたか?誰か助けてくれますか?

+0

私はjavascriptの専門家ではない。この式は、people.sort((a、b)=> a [1] -b [1])であるかもしれません。コンパレータ機能によって等価な要素の順序を保持する保証?それ以外の場合は、このコードを使用するとエラーが発生しやすくなります。正直言って:JavaScriptのようにはあまり標準化されていない言語のために、あなたはパラペットの上にあまりにも頭を上げています。これら2つのコンパレータを1つにマージすることをお勧めします。 – Paul

+0

'people.sort((a、b)=> a [1] -b [1])ソート((a、b)=> b [0] -a [0]);は同じです'people.sort((a、b)=> b [0] -a [0]);'のように、あなたは単に異なる順序付け規則を使って*頼りにしています。 2番目のソートはサブリストを操作しません*。 –

+0

@ Paul JavaScript、現在第6版であるECMA標準262で記述されているプログラミング言語は、非常に標準化されています。 「JavaScript」と「JavaScriptで使用できるブラウザAPI」を混同しないでください。それは、それが使用するいくつかのランダムなライブラリのC++を混乱させるようなものです。 –

答えて

1

最初にキューを1つのインデックスで注文した後に0インデックスで注文するため、ソートは2回適用されます。あなたは、彼らが異なる高 あなたのソート機能が矢印機能

に使用

people.sort(function(a,b){ 
    if(a[0]==b[0]){ 
     return a[1]-b[1]; 
    } 
    else{ 
     return b[0]-a[0]; 
    } 
}); 

になります持っている場合と、bは0インデックスで同じ高さや秩序を持っている場合は1、インデックスによってキュー1時間と順序を注文する必要があります

people.sort((a,b)=>a[0]==b[0]?a[1]-b[1]:b[0]-a[0]); 
+0

ソート機能は、すべてのテストを必要に応じて並べ替えることができますが、問題がどこにあるかはまだわかりません。あなたの答えをどうもありがとう! –

+0

私の回答を編集 –

+0

私はテストの例でコードを試してみましたが、問題はソート関数ではありません。 FirebugとChromeのコンソールで異なるsplice()関数です。どうもありがとうございます! –

0

より良いソート機能が必要で、最初のインデックス0を降順に、インデックス1を昇順にソートする必要があります。

people.sort((a, b) => b[0] - a[0] || a[1] - a[1]); 

ES5

var reconstructQueue = function(people) { 
 
     var result = []; 
 
     people.sort(function (a, b) { 
 
      return b[0] - a[0] || a[1] - a[1]; 
 
     }); 
 
     for (var i = 0; i < people.length; i++) { 
 
      result.splice(people[i][1], 0, people[i]); 
 
     } 
 
     return result; 
 
    }, 
 
    data = [[7, 0], [4, 4], [7, 1], [5, 0], [6, 1], [5, 2]], 
 
    result = reconstructQueue(data); 
 

 
console.log(JSON.stringify(result)); // [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

ES6

var reconstructQueue = function(people) { 
 
     var result = []; 
 
     people.sort((a, b) => b[0] - a[0] || a[1] - a[1]); 
 
     for (var i = 0; i < people.length; i++) { 
 
      result.splice(people[i][1], 0, people[i]); 
 
     } 
 
     return result; 
 
    }, 
 
    data = [[7, 0], [4, 4], [7, 1], [5, 0], [6, 1], [5, 2]], 
 
    result = reconstructQueue(data); 
 

 
console.log(JSON.stringify(result)); // [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

+0

Leetcodeのすべてのテストにも合格しませんでしたが、私はまだその理由を理解できません。とにかく、あなたの答えをどうもありがとう! –

+0

@ChuckWang、多分ES5スタイルが必要です。 –

+0

私はテストでコードを試しましたが、問題はソート関数ではありません。 FirebugとChromeのコンソールで異なるsplice()関数です。スプライス機能が実際にどのように機能するかを理解する必要があると思います。とにかくお返事いただきありがとうございます! –