Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.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 算法:下一个较大元素I(来自leetcode)_Javascript_Arrays_Algorithm - Fatal编程技术网

Javascript 算法:下一个较大元素I(来自leetcode)

Javascript 算法:下一个较大元素I(来自leetcode),javascript,arrays,algorithm,Javascript,Arrays,Algorithm,有人能告诉我在解决这个算法时我遗漏了什么吗?我遇到的一个问题是,嵌套循环中的第一个if语句没有求值,但我不知道为什么它不会求值 以下是问题的描述: 您将获得两个数组(没有重复项)nums1和nums2,其中nums1的元素是nums2的子集。在nums2的相应位置查找nums1元素的所有下一个较大数字。 nums1中数字x的下一个较大数字是nums2中其右侧的第一个较大数字。如果不存在,则输出此数字的-1 示例1: var nums1 = [4,1,2]; var nums2 = [1,3,

有人能告诉我在解决这个算法时我遗漏了什么吗?我遇到的一个问题是,嵌套循环中的第一个if语句没有求值,但我不知道为什么它不会求值

以下是问题的描述:

您将获得两个数组(没有重复项)nums1和nums2,其中nums1的元素是nums2的子集。在nums2的相应位置查找nums1元素的所有下一个较大数字。 nums1中数字x的下一个较大数字是nums2中其右侧的第一个较大数字。如果不存在,则输出此数字的-1

示例1:

 var nums1 = [4,1,2];
 var nums2 = [1,3,4,2];

  var nextGreaterElement = function(findNums, nums) {
    var holder = [];

    for (var i = 0; i < findNums.length; i++) {

     //loop through the 2nd array starting at the index of the first loop's current item. 

      for (var j = nums.indexOf(findNums[i]); i < nums.length - j; i++) {

        if (nums[j+1] > nums[j]) {
          holder.push(nums[j+1]);
          break;
        } 

        if (nums[nums.length]) {
          holder.push(-1);
        }
      }
    }
    return holder;
};

nextGreaterElement(nums1, nums2)
输入:nums1=[4,1,2],nums2=[1,3,4,2]

输出:[-1,3,-1]

说明: 对于第一个数组中的数字4,您无法在第二个数组中找到下一个更大的数字,因此输出-1。 对于第一个数组中的数字1,它在第二个数组中的下一个较大的数字是3。 对于第一个数组中的数字2,第二个数组中没有下一个更大的数字,因此输出-1

这是我到目前为止的代码:

 var nums1 = [4,1,2];
 var nums2 = [1,3,4,2];

  var nextGreaterElement = function(findNums, nums) {
    var holder = [];

    for (var i = 0; i < findNums.length; i++) {

     //loop through the 2nd array starting at the index of the first loop's current item. 

      for (var j = nums.indexOf(findNums[i]); i < nums.length - j; i++) {

        if (nums[j+1] > nums[j]) {
          holder.push(nums[j+1]);
          break;
        } 

        if (nums[nums.length]) {
          holder.push(-1);
        }
      }
    }
    return holder;
};

nextGreaterElement(nums1, nums2)
var nums1=[4,1,2];
var nums2=[1,3,4,2];
var nextgreaterelation=函数(findNums,nums){
var持有人=[];
对于(变量i=0;inums[j]){
保持架推压(nums[j+1]);
打破
} 
if(nums[nums.length]){
保持架。推动(-1);
}
}
}
报税表持有人;
};
下一步创建(nums1、nums2)

谢谢您的帮助。

您需要对正在查找的数组进行排序,以便更容易找到数字。如果数组变大,您可能需要一种搜索算法来更快地找到数组中的索引。对于将要排序的数组,您可以获取下一个数字作为大一个的数字,并检查是否位于数组的末尾。如果不执行此检查,则当找不到数字或没有更大的数字时,函数将出错。最后,你的第二个if语句没有意义。因此,在输出数组中的-1之前,我正在检查以确保我们位于数组的末尾

    var nextGreaterElement = function(findNums, nums) {
    var holder = [];
    //Should sort the array to make sure you get the next largest number
    nums = nums.sort();
    for (var i = 0; i < findNums.length; i++) {

     //loop through the 2nd array starting at the index of the first loop's current item. 

      //for (var j = nums.indexOf(findNums[i]); i < nums.length - j; i++) {
        for(var j = 0; j < nums.length; j++){
          //check for value in array and make sure the value is not at the end
          if (findNums[i] == nums[j] && j != nums.length - 1) {
            holder.push(nums[j+1]);
            break;
          } 
        //check for the last element in array if so output -1
        if (j == nums.length - 1) {
          holder.push(-1);
        }
      }
    }
    return holder;
};
var nextgreaterelation=函数(findNums,nums){
var持有人=[];
//应该对数组进行排序,以确保获得下一个最大的数字
nums=nums.sort();
对于(变量i=0;i
问题:更新变量i,但不更新内环(j-loop)中的变量j

缺少:调试工作


问题描述

理论上,您的代码设计应该将nums1中的每个值与nums2的相关部分进行比较。因此,对于nums1上的外部for循环和nums2的内部for循环相关部分,它将在外部for循环的每次迭代中转向外部for循环

在您的代码中,变量i是findNums的索引指针(即nums1),而变量j是nums的索引指针(即nums2).变量i始终在内部for循环和外部for循环中更新,而变量j在外部for循环的每次迭代中设置一次。这与您的假设操作相矛盾

调试(您丢失的工作)

找到一张纸和一支笔。坐下来,试运行程序,并记录相关信息(变量i、变量j、findNums[i]、nums[j]、…),您可以找出代码不起作用的原因


可能的解决方案

var nextgreaterelation=函数(findNums,nums){
var持有人=[];
对于(变量i=0;ifindNums[i]){
保持架推压(nums[j]);
hasNextCreateRelation=true;
打破
}
}
//未找到下一个较大元素的句柄大小写
如果(!hastNextCreateRelation){
保持架。推动(-1);
}
}
报税表持有人;
};
var findNums=[4,1,2];
var nums=[1,3,4,2];

console.log(nextgreaterelation(findNums,nums))
i
你确定你的意思不是
j
?或类似的东西。基本上,我假设你不想在
j
循环中增加
i
。谢谢你的帮助。我看到了一些地方出错了——在我的内部循环中定义变量,并放置第二个if语句不在嵌套循环的范围内。但我仍然有一个问题,如果第二个if语句仍在嵌套循环内,为什么它不将-1推送到holder数组?因为第一个if语句没有计算,它不会计算第二个语句并推送a-1,因为hasNextCreateRelation为false吗?@JackDagley the 2nd if语句从未计算过,可能是因为值
nums[nums.length]
无法转换为true。请重试