[js] 写一个方法,传入数字x,从一个一维数组里找到两个数字符合“n1 + n2 = x”

haizhilin2013
2019-11-12 04:38:56 星期二
js
                    
                        
写一个方法,传入数字x,从一个一维数组里找到两个数字符合“n1 + n2 = x”
Comments per page
< Page 1 / 2 >
encountermm 2019-11-12 01:11:36
const fn=(arr,x)=>{
	const len=arr.length;
	for(let i=0;i<len;i++){
		const another=x-arr[i]
		for(let j=i+1;j<len;j++){
			if(arr[j]===another){
                return [arr[i],arr[j]]
			}
		}
	}
}
fn([1,2,3,4,5,6],3)  //[1,2]
encountermm 2019-11-12 01:25:01

剑哥,这个是找到多组数字,还是找到一组即可😄

wheatup 2019-11-12 01:38:54
const findSum = (array, sum) => {
	let pair;
	array.find((a, i) => !isNaN(array.slice(i + 1).find(b => a + b === sum && (pair = [a, b]))));
	return pair;
};

findSum([2, 4, 8, 6, 10, 9, 7], 16);	// [6, 10]

试着只用数组方法写,性能应该不算特别好 😅

ZedCoding 2019-11-12 02:02:57
const findSum = (array, sum) => {
	let pair;
	array.find((a, i) => !isNaN(array.slice(i + 1).find(b => a + b === sum && (pair = [a, b]))));
	return pair;
};

findSum([2, 4, 8, 6, 10, 9, 7], 16);	// [6, 10]

试着只用数组方法写,性能应该不算特别好 😅

尽然不容易看懂

NicholasBaiYa 2019-11-12 08:38:13
/*方法说明
 *@method arrFindSum
 *@for 所属类名
 *@param 
 *        arr{arr} 目标数组
 *        sum{num} 目标数字
 *@return {arr} 返回数组中符合的项
 */
let arrFindSum = function (arr, sum) {
    if(!Array.isArray(arr) || !Number.isFinite(sum)) return alert('请输入符合条件的参数')
    let arrSum = []
    arr.map((e, index1) => {
        arr.forEach((ele, index2) => {
            if( index1<index2 && (e + ele == sum)){
                arrSum.push({'key1': index1, 'val1': arr[index1], 'key2':index2, 'val2' : arr[index2]})
            }
        })
    })
    return arrSum
}
arrFindSum([1,2,3,7,5,9,7,8,9,6,5,4,1], 10)
neilyoTracer 2019-11-12 15:29:39

const find2 = (arr, x) => {
const ret = [];
for(let i = 0; i < arr.length - 1; i++) {
for(let j = i+1; j < arr.length; j++) {
if(arr[i] + arr[j] === x) {
ret.push([arr[i], arr[j]])
}
}
}

return ret;
}

wheatup 2019-11-12 15:30:22
const findSum = (array, sum) => [
	array.find((a, i) => (b = array.lastIndexOf(sum - a)) >= 0 && b > i), 
	array[b]
];

findSum([2, 4, 8, 6, 10, 9, 7], 16);	// [6, 10]

优化了一下算法,第一个数从左往右找,第二个数从右往左找,应该算是最简了

Konata9 2019-11-14 06:28:18
const findSumNumber = (arr, x) => {
  const len = arr.length;
  for (let i = 0; i < len; i++) {
    const a = arr[i];
    const restNum = arr.slice(i + 1).find(b => a + b === x);

    if (restNum !== undefined && restNum !== null) {
      return [a, restNum];
    }
  }

  return null;
};
result17 2019-11-21 04:16:32

这其实是leetcode的第一题 two sum

let twoSum = function(nums, target) {
  let obj = {}
  for (let i = 0; i < nums.length; i++) {
    if (obj[target - nums[i]] !== undefined) {
      return [nums[obj[target - nums[i]]], nums[i]]
    } else {
      obj[nums[i]] = i
    }
  }
}
let findAllTwoSum = function(nums, target) {
  let obj = {}, res = []
  for (let i = 0; i < nums.length; i++) {
    if (obj[target - nums[i]] !== undefined) {
      res.push([nums[obj[target - nums[i]]], nums[i]])
    } else {
      obj[nums[i]] = i
    }
  }
  return res
}
diandianzd 2020-05-24 01:05:36
const arr = [1,2,3,4,5,6,9,10]
const sum = 12
arr.map((num,index)=>arr.includes(sum-num)?
[num,sum-num]:[]).filter(item=>item.length)

// 0: (2) [2, 10]
// 1: (2) [3, 9]
// 2: (2) [6, 6]
// 3: (2) [9, 3]
// 4: (2) [10, 2]
Comments per page
< Page 1 / 2 >
排行榜
今日答题答题排行
    未答的题
    更多>
      【关注作者公众号】 以面试驱动学习--前端剑解
      【公众号推荐】 不折腾的前端和咸鱼有什么区别

      学习不打烊,充电加油只为遇到更好的自己,365天无节假日,每天早上5点纯手工发布前端知识点(死磕自己,愉悦大家)。希望大家在这浮夸的前端圈里,保持冷静,坚持每天花20分钟来学习与思考。在这千变万化,类库层出不穷的前端,建议大家不要等到找工作时,才狂刷题,提倡每日学习!欢迎大家关注3+1开源项目!希望大家每人去学习与思考!(不要为了谁而来,要为自己而努力!

      【关注官方公众号】 每天4:30-5:00推送
      【公众号推荐】 一起折腾前端算法
      【微信学习群】 备注3+1