javascript 根据目标值标识数组的索引

wyyhbhjk  于 2023-01-07  发布在  Java
关注(0)|答案(3)|浏览(162)

其中一个挑战性的问题,我在办公室,我不能出来。需要帮助这里。

const array = [2, 7, 11, 15], target = 9;

在上面我有一个数组和目标为9,以及这个目标可以改变任何值为18,26像这样.结果应该显示indexOf数组用于获得目标.例如,目前它是9,所以结果应该是[0,1](2 + 7).如果目标是26,那么结果应该是[2,3].如何实现这一点?
对我来说,第一次尝试是成功的。但是其他的都不行。需要帮助。
我的代码:

const array = [2, 7, 11, 15], target = 9;
const result = [];
const outPut = array.reduce((c,v,i,a) => {
  if(c !== target && c < target) {
    result.push(a.indexOf(v));
  }
  return c + v;
}, 0);

console(result);
rdrgkggo

rdrgkggo1#

下面是暴力破解的解决方案:

  • 获取数组的所有子集。
  • 计算每个子集的和。
  • 将子集过滤到其和为目标的子集。
const array = [1, 2, 7, 8, 9, -2];
const target = 9;

const getAllSubsets = array => array.reduce(
  (subsets, value) => subsets.concat(subsets.map(set => [...set, value])),
  [[]]
);

const subsets = getAllSubsets(array);
const result = subsets.filter(
  subset => subset.reduce((partialSum, element) => partialSum + element, 0) == target
);
console.log(result);

此示例生成[1, 2, 7, 8, 9, -2]的所有子集,其总和为9
输出:

[ [ 2, 7 ], [ 1, 8 ], [ 9 ], [ 1, 2, 8, -2 ], [ 2, 9, -2 ] ]

您只需要做两个小的更改,就可以使用索引而不是实际值:

  • 获取array.map((_, i) => i)的所有子集而不是array以获取索引
  • 使用array[element]而不是element求和。
const array = [1, 2, 7, 8, 9, -2];
const target = 9;

const getAllSubsets = array => array.reduce(
  (subsets, value) => subsets.concat(subsets.map(set => [...set, value])),
  [[]]
);

const subsets = getAllSubsets(array.map((_, i) => i));
const result = subsets.filter(
  subset => subset.reduce((partialSum, element) => partialSum + array[element], 0) == target
);
console.log(result);
vatpfxk5

vatpfxk52#

这种方法的问题是,您可能最终添加了错误的元素;例如,如果目标是13,你的代码会先把2和7相加,然后不会返回正确的结果,因为它不会考虑加上11,因为它超过了目标。相反,你应该使用一个两指针技术(参见https://www.geeksforgeeks.org/two-pointers-technique/

u0sqgete

u0sqgete3#

const array = [2, 7, 11, 15];

let result = [];

const getResult = (target) => {
  for(let i =0; i < array.length;i++){
  let requiredValue = target - array[i];
  if(array.indexOf(requiredValue) > -1) {
    result = [array.indexOf(array[i]), array.indexOf(requiredValue)].sort();
  } 
  if(array.indexOf(requiredValue) < -1) {
    result = [0]; 
  } 
}
}
getResult(9)
console.log(result);
getResult(18)
console.log(result);
getResult(26)
console.log(result);

下面是我的解决方案:

const array = [2, 7, 11, 15];
const target = 26;
let result = [];

for(let i =0; i < array.length;i++){
  let requiredValue = target - array[i];
  if(array.indexOf(requiredValue) > -1) {
    result = [array.indexOf(array[i]), array.indexOf(requiredValue)].sort();
  }
}

console.log(result);

这对我很有效。任何人发现这个问题,请评论。改变目标并播放。

相关问题