国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JavaScript實現從數組中選出和等于固定值的n個數

2024-05-06 16:08:20
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了JavaScript實現從數組中選出和等于固定值的n個數的方法,需要的朋友可以參考下
 
 

現實生活中的問題,可能會抽象為這樣一種數據模型:

從一個數組中挑選出幾個數,讓這幾個數相加的和為指定的值。

大多數讀者應該有過網購的經歷,網購一般會有個湊單功能,假如讀者買了70元的商品,但是必須滿100元才能包郵,這時系統會自動推薦一些商品,加起來差不多就100塊錢了。

系統如何確定推薦哪些商品呢?這其實就是剛剛提到的模型,我們可以把熱銷商品的價格放到一個數組中,然后利用算法,找出數組中哪些價格的和為30元。

廢話少說,小菜給大家分享一個JavaScript版本的算法實現。

算法代碼:

function getCombBySum(array,sum,tolerance,targetCount){var util = {/*get combination from arrayarr: target arraynum: combination item lengthreturn: 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 arraygetArrayIndex: 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 needinit: function(array,sum) {//clone arrayvar _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 sumfor(i = 0;i<_array.length;i++){if(_array[i]<=sum){r.push(_array[i]);}else{break;}}return r;},//important functioncore: function(array,sum,arrayIndex,count,r){var i = 0,k = 0,combArray = [],_sum = 0,_cca = [],_cache = [];if(count == _returnMark){return;}//get current count combinationcombArray = util.getCombination(arrayIndex,count);for(i = 0;i<combArray.length;i++){_cca = combArray[i];_sum = 0;_cache = [];//calculate the sum from combinationfor(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,那么結果只包含三個數相加的情況。可選。

返回值:返回的是數組套數組結構,內層數組中的元素是操作數,外層數組中的元素是所有可能的結果。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 库伦旗| 陕西省| 治县。| 玉树县| 瑞金市| 万山特区| 鄢陵县| 台东市| 收藏| 太康县| 化州市| 沛县| 特克斯县| 虎林市| 卓尼县| 玛曲县| 嵊州市| 循化| 山东| 安福县| 册亨县| 马鞍山市| 武定县| 曲沃县| 余江县| 马鞍山市| 济源市| 澄江县| 博湖县| 武强县| 常熟市| 手游| 股票| 九龙城区| 加查县| 虹口区| 邻水| 务川| 惠安县| 吉安县| 义马市|