例:一个排好序的数列,总值为2500
array = [100, 200, 300, 400, 500, 1000]
num为0~2500的数值,可取0、2500
给出num后,从array找出一个大于等于num且与之最相近的数值放到arrayFinal中
最初思路
肯定是先遍历,如果某一个大于等于num,取之;若没有,先减最大,再遍历
如
num = 99 => 100
num = 500 => 500
num = 600 =>1000
num = 1090 => 1000+100
num = 1500 => 1000+500
num = 1600 => 1000+500+100
num = 2350 => 1000+500+400+300+100
最初思路:
var array = [100, 200, 300, 400, 500, 1000];
var arrayFinal = [];
function select(num){
for (let i=0; i<array.length; i++){
if (array[i] > num) {
arrayFinal.push(array[i]);
array.splice(i, 1);
return;
} else {
if(i == (array.length-1)){
arrayFinal.push(array[i]);
num = num - array[i];
array.splice(i, 1);
select(num);
}
}
}
}
select(2099);
console.log(arrayFinal);
=>[1000, 500, 400, 200]
for循环+递归,嗯是有点问题,机器老矣,性能撑得住否?
永目大佬 优化后思路:
var array = [100, 200, 300, 400, 500, 1000];
var arrayFinal = [];
function select(num){
while (num >= 0) {
var index = false;
for (let i=0; i<array.length; i++){
if (array[i] > num) {
index = i;
break;
}
}
if (typeof(index)=='number') {
arrayFinal.push(array[index]);
num = num - array[index];
} else {
index = array.length - 1;
arrayFinal.push(array[index]);
num = num - array[index];
array.splice(index, 1);
}
}
}
select(2099);
console.log(arrayFinal);
=>[1000, 500, 400, 200]
有一个判断条件,完美替代递归。