日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

基于JS實現計算24點算法代碼實例解析

瀏覽:164日期:2024-04-29 11:24:55

前言

休息的時候無意間看到群里有人發出了華為的校招題,一開始看題目的時候覺得很簡單,于是晚上就試著寫了一下,結果寫的過程中打臉,不斷的整理邏輯不斷的重寫,但我的性格又是不做出來晚上睡不好的那種,于是在做出來的時候就分享給大家(快凌晨三點了有木有,這校招題難度都達到這級別了?o(???)o)

題目描述

基于JS實現計算24點算法代碼實例解析

審題要注意:1+2+3*4是前面三個已經相加為6再乘4,沒有括號!!

代碼:

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <meta name='viewport' content='width=device-width, initial-scale=1.0'> <title>21點</title> <script> // 牌和對應的權重 const pokerBox = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'];//下標+1剛好就是對應的分值 let calcSym = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];//0,1,2 3,4 5,6,7 8,9分別對應+-*/ function Calculate(a, b, c) { if (c <= 2) return a + b; if (c <= 4) return a - b; if (c <= 7) return a * b; if (c <= 9) return a / b; return -1; } function filter(c) { if (c <= 2) return '+'; if (c <= 4) return '-'; if (c <= 7) return '*'; if (c <= 9) return '/'; return; } let answer = 'NONE';//回復的字符串 默認回復NONE,表示無解 function Calculate24(a, b, c, d, C1, C2, C3) { let sum = Calculate(Calculate(Calculate(a, b, C1), c, C2), d, C3); if (sum === 24) answer = `公式為:${a} ${filter(C1)} ${b} ${filter(C2)} ${c} ${filter(C3)} $75pdxxz = ${sum}`; return sum; } // 全排列 //這里的全排序就是把原先的數組復制一個出來,然后新數組代替原先數組刪除該值,temp數組添加該值,當新數組的長度為0,說明轉移完成,就把temp數組放入matrix數組中 function permutation(pokers) { let matrix = []; const subFunc = (arr, temp) => { if (temp.length > 4) temp.length = 4;//為了避免過長 if (arr.length === 0) matrix.push(temp); arr.forEach((elem, i) => { subFunc([...arr.slice(0, i), ...arr.slice(i + 1)], [...temp, elem]); }); } subFunc(pokers, []); return matrix; }; // 計算總數為24 function Count24(a, b, c, d) { calcSym.sort((x, y) => x - y);//升序排序 if (Calculate24(a, b, c, d, calcSym[0], calcSym[1], calcSym[2]) === 24) return true;//第一次判斷如果符合就不需要執行下面的循環了 let i = 1;//上面判斷了一次,因此這里從1開始 if (calcSym.length <= 10) calcSym = [...new Set(permutation(calcSym).flatMap(item=>item.join()))].map(item=>item.split(','));//二維數組去重,并獲取全排的數組(即每一種可能性) while (true) { if (Calculate24(a, b, c, d, calcSym[i][0], calcSym[i][1], calcSym[i][2]) === 24) return true; if (i < calcSym.length - 1) i++; else return false;//如果數組遍歷完都沒 }; return false; } function init() { if (calcSym.length === 12) calcSym = permutation(calcSym);//獲取全排的數組(即每一種可能性) } init();//初始化就立即執行 // 對輸入的數字進行一次全排 function calcNumber(arr) { if (Count24(arr[0], arr[1], arr[2], arr[3])) return true;//這一步滿足那么下面就不用執行permutation了,因為底層是遞歸,很消耗性能 let i = 1; if (arr.length <= 4) arr = [...new Set(permutation(arr).flatMap(item=>item.join()))].map(item=>item.split(','));//二維數組去重 if (arr.length > 1) { while (true) { if (Count24(arr[i][0], arr[i][1], arr[i][2], arr[i][3])) return true; if (i < arr.length - 1) i++; else return answer = 'NONE'; } }; return answer = 'NONE'; } // 當我輸入完光標離開的時候就開始判斷并計算 function pokers(event) { let arr = event.value.trim().split(' '); if (arr.length > 4) { arr.length = 4; document.getElementById('poker').value = arr.join(’ ’); alert('您輸入的牌數大于4張,這邊自動幫您刪除'); } if (arr.some(item => !pokerBox.includes(item))) alert('ERROR'); else { let arrNew = arr.map(item => { return pokerBox.indexOf(item) + 1 });//計算權重 calcNumber(arrNew);//執行計算 } } function dialog() { alert(answer) }; </script></head><body> <!-- 這里設置為失去焦點就開始計算是為了盡量減少用戶等待的時間,但注意不要設置為輸入就開始計算,否則瀏覽器會卡到崩潰 --> <!-- 由于是遍歷數組獲取結果,如果用戶輸入的值不為24,那么系統會查詢的很慢,這個時候的優化方案有: 一、每次用戶輸入的值和對應的回復保存在一個數組內,下次用戶輸入時先判斷是否在該數組內,不在的時候再執行計算 二、我們可以先排除一部分不可能的值放入數組,比如用戶輸入2 2 2 2或A A A A,這種怎么算都不可能為24,如果用戶輸入的為這一類就直接Pass 三、先把最耗時的calcSym數組的全排改為用戶一進入頁面就先異步加載計算 --> <input type='text' onblur='pokers(this)' name='21' id='poker'> <input type='button' onclick='dialog()' value='confirm' /></body></html>

實現的效果:

基于JS實現計算24點算法代碼實例解析

基于JS實現計算24點算法代碼實例解析

基于JS實現計算24點算法代碼實例解析

總結思路:

題目第一眼看到就應該想到遞歸,之前我是把加減乘除都設為一個方法,想采用面向切面的方式進行計算,但是這種方式邏輯復雜且無法計算復雜一點的公式,因此就改為直接把所有可能出現的結果都拿出來一一比對,只要其中一個為24就終止循環,否則循環結束之后返回NONE;

calcSym=[0,1,2,3,4,5,6,7,8,9];//0,1,23,45,6,78,9分別對應+-*/,這里為三個+,兩個-,三個*,兩個除,大家可以推理得出,6+6+6+6,1*2*3*4,2*13-1-1,13*13/13+11等等,除號和減號最多只可能有兩個,而加號和乘號最多可以為三個;

至于全排列方法permutation,是借鑒了STL的next_permutation函數(C++),之所以二維數組去重也是封裝的方法可能出現多個數組重復的情況,要知道每多一個數組,底層是用遞歸查詢一遍,瀏覽器會非常卡;

最后就是我在代碼中提到的優化方法,有興趣的小伙伴可以去試一下,代碼還有優化的空間。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久精品国产网站| 在线亚洲自拍| 亚洲一区二区三区久久久| 成人日韩在线观看| 精品视频久久| 国产精品美女久久久久久不卡| 丝瓜av网站精品一区二区| 色爱综合av| 国产夫妻在线| 97欧美在线视频| www.九色在线| 日韩深夜视频| 丝袜国产日韩另类美女| 久久久精品五月天| 久久精品午夜| 精品香蕉视频| 日本蜜桃在线观看视频| 手机在线电影一区| 日产精品一区二区| 国产盗摄——sm在线视频| 97精品国产| 精品亚洲美女网站| 久久久久国产精品一区二区| 日韩精品欧美| 欧美福利一区| 老牛国产精品一区的观看方式| 香蕉国产精品| 黄色精品网站| 在线视频观看日韩| 黄色亚洲在线| 久久av一区| 亚洲精品精选| 国产精品亚洲欧美日韩一区在线| 国产精品v日韩精品v欧美精品网站| 国产成人在线中文字幕| 成人羞羞在线观看网站| 欧美aa国产视频| 亚洲欧洲一区| 日本中文字幕视频一区| 国产精品s色| 日韩免费久久| 久久精品青草| 免费欧美日韩| 欧美日韩精品一区二区三区在线观看| 欧美国产日本| 欧美中文一区二区| 在线精品国产亚洲| 欧美精品不卡| 婷婷色综合网| 日本午夜精品一区二区三区电影| 里番精品3d一二三区| 久久蜜桃资源一区二区老牛| 麻豆9191精品国产| 国产精品成人国产| 天堂网av成人| 亚洲精品系列| 中文字幕在线官网| 欧洲一区二区三区精品| 鲁大师成人一区二区三区| 国产精品伊人| 五月天久久777| 毛片不卡一区二区| 亚洲专区在线| 九九九精品视频| 性色av一区二区怡红| 国产精品2区| 欧美日韩国产精品一区二区亚洲| 日本欧美大码aⅴ在线播放| 在线亚洲人成| 亚洲日韩中文字幕一区| 国产+成+人+亚洲欧洲在线| 欧美成人高清| 国产精品一区二区三区av| 久久久久.com| 国产精品白丝久久av网站| 亚洲激情中文| 国产成人久久精品一区二区三区| 男女激情视频一区| 精品国产一区二区三区av片| 欧美在线资源| 日韩av在线播放网址| 日韩有吗在线观看| 三上悠亚国产精品一区二区三区| 日本不卡一区二区| 久久xxx视频| 黑丝一区二区| 国产精品777777在线播放| 婷婷亚洲五月| 免费看一区二区三区| 最新国产精品视频| 亚洲v在线看| 久久精品理论片| 日本成人在线不卡视频| 五月综合激情| 欧美成人基地 | 久久xxx视频| 中文一区一区三区免费在线观| 首页国产精品| 免费在线亚洲欧美| 人人爱人人干婷婷丁香亚洲| 91久久视频| 欧美日韩亚洲在线观看| 国产精品传媒麻豆hd| 日本va欧美va精品发布| 免费日韩视频| 午夜久久黄色| 亚洲天堂久久| 超碰在线99| 日韩激情精品| 亚洲一区二区三区久久久| 天堂网在线观看国产精品| 日韩中文在线电影| 老牛影视精品| 黄色在线网站噜噜噜| 美腿丝袜在线亚洲一区| 日韩中文字幕视频网| 性一交一乱一区二区洋洋av| 日韩一区亚洲二区| 国产精品久久久久久久免费观看| 国产精品qvod| 国产精品久久| 国产精品国码视频| 国产伦精品一区二区三区视频 | 日韩高清欧美激情| 亚洲美女91| 日本一区中文字幕| 亚洲深夜福利在线观看| 国产91精品对白在线播放| 亚洲天堂1区| 99国产精品一区二区| 久久精品国产亚洲夜色av网站| av中文资源在线资源免费观看| 精品国产欧美日韩| 成人在线视频区| 国产色播av在线| 999国产精品视频| 天使萌一区二区三区免费观看| 国产精品免费看| 亚洲人成网77777色在线播放| 日韩一区二区三区高清在线观看| 青青草91视频| 欧美精品三级在线| 免费一区二区三区在线视频| 另类欧美日韩国产在线| 精品久久免费| 午夜av成人| 香蕉精品久久| 国产色99精品9i| 欧美午夜精彩| 久久国产免费看| 午夜欧美精品久久久久久久| 国产精品成人国产| 久久高清国产| 日韩一区自拍| 国产精品白丝久久av网站| 狠狠爱成人网| 国产精品专区免费| 欧美久久精品| 亚洲中午字幕| 久久精品欧美一区| 麻豆精品视频在线| 国产视频一区在线观看一区免费| 久久99久久久精品欧美| 丝袜美腿高跟呻吟高潮一区| 黄色在线观看www| 欧美日本不卡高清| 午夜电影亚洲| 日韩免费福利视频| 国产精品99精品一区二区三区∴| 丝袜美腿一区二区三区| 精品日韩视频| 精品亚洲免a| 国产精品视频一区视频二区| 久色成人在线| 91成人精品视频| 亚洲成人一区在线观看| 国产乱码精品一区二区三区四区 | 精品国产99| 日欧美一区二区| 亚洲一区欧美激情| 99久久婷婷这里只有精品| 国产+成+人+亚洲欧洲在线| 久久国产麻豆精品| 蜜臀久久久久久久| 亚洲黄色影院| 久久影视一区| 色偷偷偷在线视频播放| 久久国产婷婷国产香蕉| 国产日韩专区| 国内精品99| 亚洲福利一区| 欧美成人久久| 在线一区免费| 欧洲毛片在线视频免费观看| 中文一区一区三区高中清不卡免费| 国产精品久av福利在线观看| 日韩高清在线不卡| 日本精品一区二区三区在线观看视频| 丝袜美腿亚洲一区二区图片| 日韩视频一区二区三区在线播放免费观看|