Web前端之JavaScript给定一个整数数组和一个整数目标值,在该数组中找出和为目标值的两个整数,并返回它们对应的下标、数组求和、indexOf
Web前端之JavaScript给定一个整数数组和一个整数目标值,在该数组中找出和为目标值的两个整数,并返回它们对应的下标、数组求和、indexOf
·
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]]
使用对象属性名称唯一性去除和相等的下标值。
第一步
定义变量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
数组中即可大功告成。
双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的方式。
更多推荐
所有评论(0)