因此,您可以在下面找到我的(非常基本且未优化的(Leetcode挑战189"旋转阵列"的解决方案。这个挑战的目标如下:给定一个数组,将数组向右旋转k步,其中k是非负的。
现在,我的解决方案不被接受,因为在函数调用后,全局变量nums保持不变。为什么?不知何故,nums被视为局部变量,并且不会更改传入的全局变量nums。我知道这可能是因为javascript处理变量作用域的方式,但我似乎找不到可以帮助我理解这个例子的资源。
/**
* @param {number[]} nums
* @param {number} k
* @return {void} Do not return anything, modify nums in-place instead.
*/
var rotate = function(nums, k) {
array2 = Array.from(nums)
nums.map((num) => {
array2[(nums.indexOf(num)+k)%nums.length] = num
})
nums = Array.from(array2)
console.log(nums) // returns expected answer
};
Your input
[1,2,3,4,5,6,7]
3
Your stdout
[5,6,7,1,2,3,4]
Your answer
[1,2,3,4,5,6,7]
Expected answer
[5,6,7,1,2,3,4]
map
函数不会修改原始数组。此外,您似乎使用错误。
您正在使用map
设置array2
的值,然后将nums
设置为array2
的副本。这不会修改nums
中包含的原始对象。
当然,如果您在函数中记录nums
,它会给您更新的值,但该值的范围在函数中,不能在外部访问。
对于这种类型的不纯编程,应该使用for循环,而不是数组方法。
var rotate = function(nums, k) {
array2 = Array.from(nums);
for (const i in nums) nums[i] = array2[(i+k)%nums.length];
};
您的方法是正确的,但问题是:
var rotate = function(nums, k) {
array2 = Array.from(nums)
nums.map((num) => {
array2[(nums.indexOf(num)+k)%nums.length] = num //Making changed to array2
})
nums = Array.from(array2) //Completely changing the reference of nums
console.log(nums) // returns expected answer
};
let nums = [1,2,3,4,5,6,7];
rotate(nums,3);
console.log(nums); //Original nums still as it is
如果您查看上面的代码,nums
实际上并没有改变。原因是您正在创建一个全新的数组array2
。在.map()
中,您正在对其进行各种更改,并将其重新分配给nums
。但是原始CCD_ 12的引用没有改变。
实际上,您应该对nums
进行更改,并使用array2
获得帮助:
var rotate = function(nums, k) {
array2 = Array.from(nums)
array2.forEach((num) => {
nums[(array2.indexOf(num)+k)%array2.length] = num
})
console.log(nums) // returns expected answer
};
let nums = [1,2,3,4,5,6,7];
rotate(nums,3);
console.log(nums);
PS:.map()
是您想要返回一个新的转换数组的时候。否则,您可以简单地使用.forEach
或for循环。