indexOf

版本一

function twoSum(nums, target) {
    let i = 0,
        len = nums.length;

    for (; i < len; i++) 
    	if (nums.indexOf(target - nums[i]) > -1) return [i, nums.indexOf(target - nums[i])];
}

console.log(twoSum([2, 7, 11, 15], 9));
// [0, 1]

存在缺陷
var nums = [2, 7, 11, 15, 7, 3, 6];
var target = 9;
若用indexOf方法,则输出[0, 1],因为return打断了循环。若解决return打断循环的问题,则输出[0, 1]和[5, 6]缺少[0, 4]。版本二已完善此问题。


版本二

function sueForPeace(nums, target) {
    let obj = {},
        arr = [];

    for (i = 0; i < nums.length; i++) {
        let existence = nums.indexOf(target - nums[i]),
            isBoolean = existence > -1;

        if (isBoolean) obj[i + existence] = [existence, i];
    }

    for (const key in obj) {
        if (Object.hasOwnProperty.call(obj, key)) arr.push(obj[key]);
    }

    return arr;
}

console.log(sueForPeace([2, 7, 11, 1, 5, 30, 6, 3, 9, 8], 9));
// [[0, 1],[3, 9],[6, 7]]

使用对象属性名称唯一性去除和相等的下标值。
第一步
定义变量objarrobj的作用是存储唯一值,arr是最终返回的下标值。
第二步
nums.indexOf(target - nums[i])的理解,比如第一次循环的结果是nums.indexOf(7)indexOf方法会到数组nums中寻找是否存在7。如果存在,把7的下标返回,否则返回-1。再使用得到的结果与-1比较即可知道数组是否有两个值相加等于target的值。
第三步
使用下标相加作为obj的属性名存储对应下标数组值。因为循环第二个对应下标时会再次存储下标,此时下标已经颠倒。所以在第二次匹配时把下标反过来写即可得到第一次匹配的顺序。
第四步
使用for in循环把obj对应的值pusharr数组中即可大功告成。


双for实现

function towSum(nums, target) {
    let len = nums.length;

    for (let i = 0; i < len; i++) {
        for (let j = i + 1; j < len; j++)
            if (nums[i] + nums[j] == target) return [i, j];
      	}
 	}
}

console.log(towSum([3, 2, 6, 4], 6));
// [1, 3]

不推荐使用双for的方式。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐