js面试题 给定数组 与目标值 求数组中任意数的和 等于目标值 的下标
题目描述 给定 随机数组 与目标值 进行匹配 任意数字和等于目标值 输入这些数字的下标
分析
任意数字组合 Cn1 +Cn2+…=2^n -1
与位运算 比如 1101 就是取 第1第2第4个数 这样可以得到所有的组合类型
代码的实现是 数组 和 值都实现了的
function CalSum(array,result)
/*
1 1
2 3 2+1
3 7 3+3+1
4 15 4+6+4+1
n 2^n-1
*/
{
for (i = 1; i < 1 << array.length; i++)//从1循环到2^N N为数组长度
{
var sum=0;
var temp = "";
var temp2 =""
for (j = 0; j <array.length; j++)
{
if ((i & 1 << j) != 0)//用i与2^j进行位与运算,若结果不为0,则表示 i的 第j位不为0,从数组中取出第j个数
// 1(j个0)
{
sum += array[j];
temp += j + "-"; // index存放为字符串类型
temp2 += array[j]+"-" //将值存放为字符串类型
}
}
if(sum==result){
var t=temp.split('-') // 将字符串中的符号删去 一一存入数组
var t2 = temp2.split('-') //
var p=[];
var values =[];
t.map((value)=>{
if(value)
p.push(value)
})
t2.map(item=>{
if(item)
values.push(item)
})
console.log("values",values);
console.log("index",p)
}
}
}
var aa=[1,5,8,17,29,33,39,11,16];
var bb=33;
CalSum(aa,bb)
/*
values [ '33' ]
index [ '5' ]
values [ '5', '17', '11' ]
index [ '1', '3', '7' ]
values [ '17', '16' ]
index [ '3', '8' ]
values [ '1', '5', '11', '16' ]
index [ '0', '1', '7', '8' ]
*/