Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 406(LeetCode)。队列高度重构_Javascript_Algorithm - Fatal编程技术网

Javascript 406(LeetCode)。队列高度重构

Javascript 406(LeetCode)。队列高度重构,javascript,algorithm,Javascript,Algorithm,那么问题来了: 假设您有一个随机的排队人员列表。每个人都用一对整数(h,k)来描述,其中h是该人的身高,k是该人前面身高大于或等于h的人数。编写一个算法来重建队列 注: 人数不足1100人 例如: 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 = fun

那么问题来了:

假设您有一个随机的排队人员列表。每个人都用一对整数(h,k)来描述,其中h是该人的身高,k是该人前面身高大于或等于h的人数。编写一个算法来重建队列

注: 人数不足1100人

例如:

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;
};
var restructionqueue=函数(人){
var结果=[];
排序((a,b)=>a[1]-b[1])。排序((a,b)=>b[0]-a[0]);

对于(var i=0;i您将应用排序两次,这是不正确的,因为第一次按1索引排序队列,然后按0索引排序。如果a和b具有相同的高度,则必须按1索引排序队列,如果a和b具有不同的高度,则必须按0索引排序 您的排序函数将是

people.sort(function(a,b){
    if(a[0]==b[0]){
        return a[1]-b[1];
    }
    else{
        return b[0]-a[0];
    }
});
使用箭头函数

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

您需要一个更好的排序函数,对第一个索引0进行降序排序,对索引1进行升序排序

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

var restructionqueue=函数(人){
var结果=[];
人员。排序(功能(a、b){
返回b[0]-a[0]| a[1]-a[1];
});
for(var i=0;iconsole.log(JSON.stringify(result));//[[5,0]、[7,0]、[5,2]、[6,1]、[4,4]、[7,1]]
这是我的解决方案,运行时间为88毫秒

// sort people by height ASC, then sort people by order DESC
const sortPeople = (a, b) => {
  if (a[0] === b[0]) {
    return a[1] - b[1];
  } else {
    return b[0] - a[0];
  }
}

const reconstructQueue = (people) => {
  const output = [];

  people.sort(sortPeople);

  people.forEach(p => output.splice(p[1], 0, p));

  return output;
};

我不是javascript方面的专家。可能是这个表达式
people.sort((a,b)=>a[1]-b[1]).sort((a,b)=>b[0]-a[0]);
可以保证在根据比较器函数等价的元素上保持顺序?否则,使用这段代码很容易出错。老实说:对于像javascript这样标准化程度很低的语言,您的想法太离谱了。我建议合并这两个比较器请注意,
people.sort((a,b)=>a[1]-b[1]).sort((a,b)=>b[0]-a[0]);
people.sort((a,b)=>b[0]-a[0])相同;
,您只是使用不同的排序规则。第二种排序不在子列表上运行。@Paul JavaScript,ECMA standard 262(目前为第6版)描述的编程语言是非常标准化的。不要将“JavaScript”与“可在JavaScript中使用的浏览器API”混淆这就像是C++对某些随机库的混淆。排序函数可以像我所尝试的那样对所有的测试排序,所以问题不应该是排序函数。它的可能副本没有通过Leetcode的所有测试,我仍然找不出原因;不管怎样,谢谢你的回答。“ChuckWang,也许你需要ES5风格。我已经在测试中尝试了代码,问题不在于排序函数,而在于splice()在firebug和chrome的控制台中工作不同的函数;因此我想我需要弄清楚拼接函数实际上是如何工作的;非常感谢你的回答!在chrome上应该可以很好地工作。排序函数可以按照我的要求对所有测试进行排序,尽管我仍然找不到问题所在;非常感谢你的回答!我已经找到了使用测试示例编写代码时,问题不在于排序函数;而在于splice()函数,它在firebug和chrome的控制台中的工作方式不同;非常感谢!