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