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 相关文章推荐
更正确的asp冒泡排序
May 24 Javascript
javascript 操作cookies及正确使用cookies的属性
Oct 15 Javascript
js验证整数加保留小数点的简单实例
Dec 02 Javascript
JavaScript搜索字符串并将搜索结果返回到字符串的方法
Apr 06 Javascript
jQuery抛物线运动实现方法(附完整demo源码下载)
Jan 08 Javascript
Bootstrap CSS布局之按钮
Dec 17 Javascript
Vue.js系列之项目搭建(1)
Jan 03 Javascript
webpack独立打包和缓存处理详解
Apr 03 Javascript
layui选项卡效果实现代码
May 19 Javascript
在Vue-cli里应用Vuex的state和mutations方法
Sep 16 Javascript
详解Vue-Router源码分析路由实现原理
May 15 Javascript
MutationObserver在页面水印实现起到的作用详解
Jul 07 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
程序员编程十条戒律
2009/07/09 PHP
PHP编码转换
2012/11/05 PHP
Youku 视频绝对地址获取的方法详解
2013/06/26 PHP
ueditor 1.2.6 使用方法说明
2013/07/24 PHP
php实现读取超大文件的方法
2014/07/28 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
php 查找数组元素提高效率的方法详解
2017/05/05 PHP
jquery 防止表单重复提交代码
2010/01/21 Javascript
javascript cookie操作类的实现代码小结附使用方法
2010/06/02 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
js实现简单鼠标跟随效果的方法
2015/04/10 Javascript
创建自己的jquery表格插件
2015/11/25 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
JavaScript实现瀑布流以及加载效果
2017/02/11 Javascript
vue实现单选和多选功能
2017/08/11 Javascript
node.js-v6新版安装具体步骤(分享)
2017/09/06 Javascript
AngularJS $http post 传递参数数据的方法
2018/10/09 Javascript
webpack 代码分离优化快速指北
2019/05/18 Javascript
vue - props 声明数组和对象操作
2020/07/30 Javascript
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
详解Python绘图Turtle库
2019/10/12 Python
Python实现不规则图形填充的思路
2020/02/02 Python
python实现数字炸弹游戏程序
2020/07/17 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
使用HTML5和CSS3表单验证功能
2017/05/05 HTML / CSS
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
木马的传播途径主要有哪些
2016/04/08 面试题
如何进行Linux分区优化
2013/02/12 面试题
日本语毕业生自荐信
2014/02/01 职场文书
学校爱心捐款倡议书
2014/05/13 职场文书
英语教师求职信
2014/06/16 职场文书
社区娱乐活动方案
2014/08/21 职场文书
奥巴马当选演讲稿
2014/09/10 职场文书
Python insert() / append() 用法 Leetcode实战演示
2021/03/31 Python