前端技術分享:不重複的組成4位數求平均值
技術分享:不重複的組成4位數求平均值。解決方案應用了動態規劃的演算法思想,下面我們一起來看看什麼是動態規劃吧。
一、動態規劃動態規劃的定義
動態規劃(dynamic programming)是運籌學的一個分支,20世紀50年代初美國數學家R.E.Bellman等人在研究多階段決策過程(multistep decisions)的最佳化問題時,提出了著名的最最佳化原理,把多階段過程轉化為-系列單階段問題,利用各階段之間的關係,逐個求解,創立了解決這類過程最佳化問題的新方法-動態規劃。 動態規劃常常適用於有重疊子問題和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。
動態規劃背後的基本思想非常簡單。大致上,若要解一個給定問題,我們需要解其不同部分(即子問題),再根據子問題的解以得出原問題的解。通常許多子問題非常相似,為此動態規劃法試圖僅僅解決每個子問題一次,從而減少計算量:一旦某個給定子問題的解已經算出,則將其記憶化儲存,以便下次需要同一個子問題解之時直接查表。
這種做法在重複子問題的數目關於輸入的規模呈指數增長時特別有用動態規劃的步驟尋找最優子結構(狀態表示)歸納狀態轉移方程邊界初始化二、解決方案思考過程 求所有四位數的平均值,我可以把問題縮小,先把四位數的所有組合找出來 想一想,求四位數的所有組合,如果我已知三位數的所有組合,能不能幫助我更快求出四位數的所有組合。 如果這裡問題不是所有四位數,是六數位或者更多,我能用同樣的函式得到答案嗎 狀態轉移方程當我們知道三位數的所有組合,就能利用規律求出四位數的所有組合,那麼現在只需要求出三位數的所有組合了;求出兩位數的所有組合,就可以利用規律求出三位數的所有組合;求出一位數的所有組合,再利用規律求出兩位數的所有組合。那這裡問題就被分解成了兩個 1. 一位數的所有組合是什麼 2. 這個規律是什麼第一個問題,相信所有人很快就能得到答案,“3”的所有組合就是[3],“1”的所有組合就是[1]。
第二個問題,我們來想一下思路 當問題是求出“1”所有組合,剛剛求出了答案是[1] 當問題是求出“1,3“所有組合時: 我們可以在[1]的左邊插入3,可以在[1]的右邊插入3,結果是[13,31]當問題是求出“1,3,5”的所有組合我們可以在“1,3”所有組合的基礎上來求,“13”的左邊、中間、右邊插入5,那麼結果有[513,153,135],“31”的左邊、中間、右邊插入5,所有結果是[531,351,315],那麼“1,3,5”這三個數的所有組合是[513,153,135,531,351,315]。到這裡,我已經發現了規律,我要求“1350”這四位數的所有組合,我只需要求出”135“這三個數的所有組合,然後再對其每個數的每個位置插入新的數(0)即可找打所有的四位陣列合了寫程式碼let arr = [1, 3, 5,0]
console.log(main(arr))
// 主方法入口
function main(arr) {
let allValue = [];
for (let r of arr) {
allValue = insert(allValue, r)
// 輸出一下 每一次都會輸出當前結果
console.log(allValue)
}
// 最後計算平均數
// 加起來的數
let sum = 0
for (let num of allValue) {
sum += parseInt(num)
}
return sum / allValue.length;
}
/**
* allArr 表示插入的集合 是一個陣列 表示之前已經計算出的陣列合計
* insertValue表示當前插入的值
* insert([],1) // ['1']
* insert(['1'], 3) // ['31','13']
* insert(['13','31'], 5) // ['531', '351', '315', '513', '153', '135']
*/
function insert(allArr, insertValue) {
// 特殊處理為空情況
if (allArr.length == 0) return [insertValue + '']
let result = []
for (let nowValue of allArr) {
// 進行插入操作 重點 i<=nowValue.length 是可以在末尾也插入值 實際迴圈比nowValue的長度多一次
for (let i = 0; i <= nowValue.length; i++) {
result.push(insertStr(nowValue, i, insertValue))
}
}
return result
}
/**
* 字串插入
* source 原字串
* start表示插入位置
* newStr 表示插入新的字串
* insertStr('1234',0,'5') // 51234
* insertStr('1234',3,'5') // 12354
* insertStr('1234',4,'5') // 12345
*/
function insertStr(source, start, newStr) {
return source.slice(0, start) + newStr + source.slice(start);
}
本文來自千鋒教育,轉載請註明出處。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31548651/viewspace-2838733/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JavaScript隨機不重複的字元組成新的字串JavaScript隨機字元字串
- 技術分享:如何避免ajax重複請求?
- 高效產生一組不重複的隨機數隨機
- 公司內部技術分享會:覆盤我的前端成長前端
- JavaScript求陣列數字的平均值JavaScript陣列
- C++【生成16個不重複字母】(生成不重複隨機數)C++隨機
- 匹配指定位數不重複數字
- 高效產生不重複的隨機數隨機
- 出色的技術分享是如何煉成的?
- 不重視技術,何談掌握核心技術?
- 組內技術分享-Activity 的啟動模式模式
- 巧用物件,生成不重複隨機數物件隨機
- MySQL組複製MGR(一)-- 技術概述MySql
- MySQL高可用之組複製技術(3):配置多主模型的組複製MySql模型
- MySQL高可用之組複製技術(2):配置單主模型的組複製MySql模型
- 技術到底重不重要
- 求陣列平均值陣列
- 如何生成隨機不重複的11位數字隨機
- matlab之生成不重複的隨機整數Matlab隨機
- mongodb怎麼統計不重複數量?MongoDB
- 前端技術分享:JavaScript正則全面解析前端JavaScript
- 百度筆試題:找最小的不重複數筆試
- Excel 透視表如何不重複計數Excel
- Java技術分享之變數命名Java變數
- iOS開發與前端技術分享【成都站】iOS前端
- web前端技術分享Electron之Renderer Process APIWeb前端API
- web前端技術分享Electron之IPC 通訊Web前端
- web前端技術分享:常用JavaScript框架有哪些?Web前端JavaScript框架
- 輸出一個百位數,1-5之間所有組合型別,數字不重複型別
- 計算機組成原理與介面技術(二)計算機
- PHP技術分享-提取字串中的數字PHP字串
- 分享手淘過年專案中採用到的前端技術前端
- mao/reduce實現求平均值
- javascript生成不重複隨機數程式碼例項JavaScript隨機
- 高效產生一組不重複的隨機數(受程式設計珠磯啟示)java實現隨機程式設計Java
- GMTC全球大前端技術大會幹貨分享前端
- web前端技術分享之頁面元素水平居中Web前端
- 前端技術分享:什麼是MongoDB資料庫?前端MongoDB資料庫