有人可以告诉我在解决这个算法时我缺少什么吗?我遇到的一个问题是我在嵌套循环中的第一个if语句没有评估,但我不知道为什么它不会评估。
以下是问题的描述:
您将获得两个数组(不重复)nums1和nums2,其中nums1的元素是nums2的子集。在nums2的相应位置找到nums1' s元素的所有下一个更大的数字。 nums1中的数字x的下一个更大数字是nums2中右边第一个更大的数字。如果它不存在,则输出该数字的-1。
示例1:
输入: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)
感谢您的帮助。
答案 0 :(得分:1)
问题:在内循环(j-loop)中更新变体i,但不更新变体j
缺失:调试工作量
问题说明
理论上,您的代码设计应将 nums1 中的每个值与 nums2 的相关部分进行比较。因此,对于外部for循环的每次迭代,它将转向外部for循环以循环 nums1 和内部for循环以循环 nums2 的相关部分
在你的代码中,variant i是findNums的索引指针(即 nums1 ),而variant j是nums的索引指针(即 nums2 )。变量i总是在内部for循环和外部for循环中更新,而变量j在外部for循环的每次迭代中都设置一次。这与你想要做的事情相矛盾。
调试(您的遗失工作)
找一张纸和一支笔。坐下来,干运行程序并保持记录相关信息(变种i,变种j,findNums [i],nums [j],...),你可以找出你的代码无法正常工作的原因。
可能的解决方案
var nextGreaterElement = function(findNums, nums) {
var holder = [];
for (var i = 0; i < findNums.length; i++) {
var hasNextGreaterElement = false;
// try to serach for next greater element
for (var j = nums.indexOf(findNums[i])+1; j < nums.length; j++) {
// handle case for next greater element is found
if (nums[j] > findNums[i]) {
holder.push(nums[j]);
hasNextGreaterElement = true;
break;
}
}
// handle case for next greater element is not found
if (!hasNextGreaterElement) {
holder.push(-1);
}
}
return holder;
};
var findNums=[4,1,2];
var nums=[1,3,4,2];
console.log(nextGreaterElement(findNums, nums));
答案 1 :(得分:0)
您需要对正在查找的阵列进行排序,以便更容易找到该号码。如果数组变大,您可能希望搜索算法更快地找到数组中的索引。对于要进行排序的数组,您可以将下一个数字作为一个更大的数字,并检查您是否位于数组的末尾。如果您不这样做,请检查当您找不到该号码或没有更大号码时该功能会出错。最后你的第二个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;
};