【问题标题】:Sort method altering constant value [duplicate]改变常量值的排序方法[重复]
【发布时间】:2019-10-02 19:42:49
【问题描述】:

所以,我正在尝试这个 LeetCode 问题 = https://leetcode.com/problems/two-sum/

我编写的解决方案要求我对数组进行排序,但我需要返回与原始数组相关的索引。因此,我创建了一个常量来存储原始数据,然后在找到这些索引后进行搜索。

我的解决方案最终无法正常工作,因为排序方法正在改变该常量值。我不知道为什么会这样,我只知道 sort 方法在调用时会改变原始数组(这就是为什么我需要在排序之前存储它)。我认为如果 a 创建了一个常量,之后就无法更改它。这就是为什么我认为这是一个错误或什么的原因

这是我一直在尝试的代码(为了清楚起见,我将 console.logs 留在那里)

要测试你应该使用

nums = [3, 2, 4]
target = 6
var twoSum = function(nums, target) {
    var max = nums.length - 1;
    var min = 0;

    const nums2 = nums;
    console.log(nums2)
    var nums1 = nums.sort(function(a,b){return a - b});
    console.log(nums2)
    while (min != max){

        if (nums1[min] + nums1[max] > target) {
            max -= 1;
        } else if (nums1[min] + nums1[max] < target) {
            min += 1;
        };        
        if (nums1[min] + nums1[max] == target) {
            return [nums2.indexOf(nums1[min]), nums2.indexOf(nums1[max])];        
        };
    };    
};

【问题讨论】:

  • 嘿,谢谢!!这些很有帮助。我不认为它实际上是重复的,因为在那个线程中讨论的是通过声明将值重新分配给常量的问题。在我的示例中,如果 nums2 是常量,我不应该更改它的值。我并不是说我分配给 nums2 的内容不能更改,我认为这是另一个线程的主题。至少,我找不到它
  • 你没有重新分配你的常量——它是一个数组,所以它是一个对象。改变一个对象是可能的,即使它是一个const。您的numsnums2 是*同一个对象,而不是碰巧持有相同值的两个不同对象。
  • 没有改变 const 值,你改变了它引用的内容。
  • 对我来说,发生这种情况很奇怪。这是我第一次发帖甚至登录,但我应该再研究一下,因为 VLAZ 发布的链接实际上可以解决我的问题...谢谢

标签: javascript arrays debugging


【解决方案1】:

这里有两件事:

  1. const nums2 = nums; 确实复制数组,它只是给你一个不可重新分配的引用(例如,你不能用=nums2 分配一个新值,但num2 的内容是等着拿)
  2. nums.sort(...) 排序就地,因此它确实修改了原始数组 (见Array.prototype.sort)。由于nums2 是对nums 的引用,因此它会在第二个console.log 中显示对nums 的更改

nums = [3, 2, 4]
target = 6
var twoSum = function(nums, target) {
    var max = nums.length - 1;
    var min = 0;

    // force a copy of the array
    // note: this is a shallow copy
    const nums2 = nums.slice();
    console.log(nums2)
    var nums1 = nums.sort(function(a,b){return a - b});
    console.log(nums2)
    while (min != max){

        if (nums1[min] + nums1[max] > target) {
            max -= 1;
        } else if (nums1[min] + nums1[max] < target) {
            min += 1;
        };        
        if (nums1[min] + nums1[max] == target) {
            return [nums2.indexOf(nums1[min]), nums2.indexOf(nums1[max])];        
        };
    };    
};

twoSum(nums, target);

【讨论】:

  • 这可能工作得很好。谢谢!!!
  • @RodrigoMallmann 如果这确实为您提供了您认为有价值的答案,您也可以将其标记为回答您的问题。 stackoverflow.com/help/someone-answers
  • 对不起,我是个菜鸟!哈哈哈。现在我想我已经做到了
猜你喜欢
  • 2010-10-04
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多