JavaScript实现从数组中选出和等于固定值的n个数


Posted in Javascript onSeptember 03, 2014

现实生活中的问题,可能会抽象为这样一种数据模型:

从一个数组中挑选出几个数,让这几个数相加的和为指定的值。

大多数读者应该有过网购的经历,网购一般会有个凑单功能,假如读者买了70元的商品,但是必须满100元才能包邮,这时系统会自动推荐一些商品,加起来差不多就100块钱了。

系统如何确定推荐哪些商品呢?这其实就是刚刚提到的模型,我们可以把热销商品的价格放到一个数组中,然后利用算法,找出数组中哪些价格的和为30元。

废话少说,小菜给大家分享一个JavaScript版本的算法实现。

算法代码:

function getCombBySum(array,sum,tolerance,targetCount){
var util = {
/*
get combination from array
arr: target array
num: combination item length
return: one array that contain combination arrays
*/
getCombination: function(arr, num) {
var r=[];
(function f(t,a,n)
{
if (n==0)
{
return r.push(t);
}
for (var i=0,l=a.length; i<=l-n; i++)
{
f(t.concat(a[i]), a.slice(i+1), n-1);
}
})([],arr,num);
return r;
},
//take array index to a array
getArrayIndex: function(array) {
var i = 0,
r = [];
for(i = 0;i<array.length;i++){
r.push(i);
}

return r;
}
},logic = {
//sort the array,then get what's we need
init: function(array,sum) {
//clone array
var _array = array.concat(),
r = [],
i = 0;
//sort by asc
_array.sort(function(a,b){
return a - b;
});
//get all number when it's less than or equal sum
for(i = 0;i<_array.length;i++){
if(_array[i]<=sum){
r.push(_array[i]);
}else{
break;
}
}

return r;
},
//important function
core: function(array,sum,arrayIndex,count,r){
var i = 0,
k = 0,
combArray = [],
_sum = 0,
_cca = [],
_cache = [];

if(count == _returnMark){
return;
}
//get current count combination
combArray = util.getCombination(arrayIndex,count);
for(i = 0;i<combArray.length;i++){
_cca = combArray[i];
_sum = 0;
_cache = [];
//calculate the sum from combination
for(k = 0;k<_cca.length;k++){
_sum += array[_cca[k]];
_cache.push(array[_cca[k]]);
}
if(Math.abs(_sum-sum) <= _tolerance){
r.push(_cache);
} 
}

logic.core(array,sum,arrayIndex,count-1,r);
}

},
r = [],
_array = [],
_targetCount = 0,
_tolerance = 0,
_returnMark = 0;

//check data
_targetCount = targetCount || _targetCount;
_tolerance = tolerance || _tolerance;

_array = logic.init(array,sum);
if(_targetCount){
_returnMark = _targetCount-1;
}

logic.core(_array,sum,util.getArrayIndex(_array),(_targetCount || _array.length),r);

return r;
}

调用说明:

array: 数据源数组。必选。

sum: 相加的和。必选。

tolerance: 容差。如果不指定此参数,则相加的和必须等于sum参数,指定此参数可以使结果在容差范围内浮动。可选。

targetCount: 操作数数量。如果不指定此参数,则结果包含所有可能的情况,指定此参数可以筛选出固定数量的数相加,假如指定为3,那么结果只包含三个数相加的情况。可选。

返回值:返回的是数组套数组结构,内层数组中的元素是操作数,外层数组中的元素是所有可能的结果。

Javascript 相关文章推荐
侧栏跟随滚动的简单实现代码
Mar 18 Javascript
了不起的node.js读书笔记之mongodb数据库交互
Dec 22 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
Aug 15 Javascript
BootStrap中的表单大全
Sep 07 Javascript
Angular.js中下拉框实现渲染html的方法
Jun 18 Javascript
创建简单的node服务器实例(分享)
Jun 23 Javascript
如何重置vue打印变量的显示方式
Dec 06 Javascript
浅谈webpack-dev-server的配置和使用
May 17 Javascript
从0到1搭建element后台框架优化篇(打包优化)
May 12 Javascript
小程序中this.setData的使用和注意事项
Aug 28 Javascript
Nuxt使用Vuex的方法示例
Sep 06 Javascript
微信小程序开发(二):页面跳转并传参操作示例
Jun 01 Javascript
JavaScript实现找出数组中最长的连续数字序列
Sep 03 #Javascript
js实现的类似于asp数据字典的数据类型代码实例
Sep 03 #Javascript
jQuery表格列宽可拖拽改变且兼容firfox
Sep 03 #Javascript
Egret引擎开发指南之视觉编程
Sep 03 #Javascript
Egret引擎开发指南之发布项目
Sep 03 #Javascript
Egret引擎开发指南之运行项目
Sep 03 #Javascript
JavaScript实现找出字符串中第一个不重复的字符
Sep 03 #Javascript
You might like
php 无极分类(递归)实现代码
2010/01/05 PHP
discuz加密解密函数使用方法和中文注释
2014/01/21 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
一个加密JavaScript的开源工具PACKER2.0.2
2006/11/04 Javascript
在jQuery中 常用的选择器介绍
2013/04/16 Javascript
JavaScript中Window对象的属性及事件
2015/12/25 Javascript
AngularJS基础 ng-model-options 指令简单示例
2016/08/02 Javascript
ionic App问题总结系列之ionic点击系统返回键退出App
2017/08/19 Javascript
vue-cli中的babel配置文件.babelrc实例详解
2018/02/22 Javascript
详解如何用babel转换es6的class语法
2018/04/03 Javascript
教你完全理解ReentrantLock重入锁
2019/06/03 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
python中函数总结之装饰器闭包详解
2016/06/12 Python
Django中针对基于类的视图添加csrf_exempt实例代码
2018/02/11 Python
python3调用R的示例代码
2018/02/23 Python
详解Python函数式编程—高阶函数
2019/03/29 Python
python中设置超时跳过,超时退出的方式
2019/12/13 Python
pytorch 把图片数据转化成tensor的操作
2021/03/04 Python
HTML5新控件之日期和时间选择输入的实现代码
2018/09/13 HTML / CSS
HTML5 History API 实现无刷新跳转
2016/01/11 HTML / CSS
斯洛伐克时尚服装网上商店:Cellbes
2016/10/20 全球购物
Omio俄罗斯:一次搜索公共汽车、火车和飞机的机票
2018/11/17 全球购物
几个Linux面试题笔试题
2012/12/01 面试题
营业经理岗位职责
2013/11/10 职场文书
大学生职业生涯设计书
2014/01/02 职场文书
结对共建协议书
2014/08/20 职场文书
综治工作心得体会
2014/09/11 职场文书
幼儿园小班家长评语
2014/12/30 职场文书
党支部考察鉴定意见
2015/06/02 职场文书
我的法兰西岁月观后感
2015/06/09 职场文书
运动会1000米加油稿
2015/07/21 职场文书
Python爬取科目四考试题库的方法实现
2021/03/30 Python
python 机器学习的标准化、归一化、正则化、离散化和白化
2021/04/16 Python
Pytorch中的学习率衰减及其用法详解
2021/06/05 Python
缓存替换策略及应用(以Redis、InnoDB为例)
2021/07/25 Redis
收音机爱好者玩机13年,简评其使用过的19台收音机
2022/04/30 无线电