电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:91日期: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)} $kyfajey = ${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
相關文章:
主站蜘蛛池模板: 对辊破碎机_四辊破碎机_双齿辊破碎机_华盛铭重工 | 振动筛,震动筛,圆形振动筛,振动筛价格,振动筛厂家-新乡巨宝机电 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 无锡网站建设-做网站-建网站-网页设计制作-阿凡达建站公司 | 河南不锈钢水箱_地埋水箱_镀锌板水箱_消防水箱厂家-河南联固供水设备有限公司 | MES系统-WMS系统-MES定制开发-制造执行MES解决方案-罗浮云计算 | 服务器之家 - 专注于服务器技术及软件下载分享 | 浴室柜-浴室镜厂家-YINAISI · 意大利设计师品牌 | 咿耐斯 |-浙江台州市丰源卫浴有限公司 | 回收二手冲床_金丰旧冲床回收_协易冲床回收 - 大鑫机械设备 | 恒温振荡混匀器-微孔板振荡器厂家-多管涡旋混匀器厂家-合肥艾本森(www.17world.net) | [品牌官网]贵州遵义双宁口腔连锁_贵州遵义牙科医院哪家好_种植牙_牙齿矫正_原华美口腔 | 小型高低温循环试验箱-可程式高低温湿热交变试验箱-东莞市拓德环境测试设备有限公司 | 塑胶地板-商用PVC地板-pvc地板革-安耐宝pvc塑胶地板厂家 | 香港新时代国际美容美发化妆美甲培训学校-26年培训经验,值得信赖! | 免费B2B信息推广发布平台 - 推发网 | 铁盒_铁罐_马口铁盒_马口铁罐_铁盒生产厂家-广州博新制罐 | 磨煤机配件-高铬辊套-高铬衬板-立磨辊套-盐山县宏润电力设备有限公司 | 昆山新莱洁净应用材料股份有限公司-卫生级蝶阀,无菌取样阀,不锈钢隔膜阀,换向阀,离心泵 | 齿轮减速马达一体式_蜗轮蜗杆减速机配电机-德国BOSERL齿轮减速电动机生产厂家 | 气弹簧定制-气动杆-可控气弹簧-不锈钢阻尼器-工业气弹簧-可调节气弹簧厂家-常州巨腾气弹簧供应商 | 手术室净化厂家_成都实验室装修公司_无尘车间施工单位_洁净室工程建设团队-四川华锐16年行业经验 | pos机办理,智能/扫码/二维码/微信支付宝pos机-北京万汇通宝商贸有限公司 | 烘箱-工业烘箱-工业电炉-实验室干燥箱 - 苏州华洁烘箱制造有限公司 | 刺绳_刀片刺网_刺丝滚笼_不锈钢刺绳生产厂家_安平县浩荣金属丝网制品有限公司-安平县浩荣金属丝网制品有限公司 | 砍排机-锯骨机-冻肉切丁机-熟肉切片机-预制菜生产线一站式服务厂商 - 广州市祥九瑞盈机械设备有限公司 | 背压阀|减压器|不锈钢减压器|减压阀|卫生级背压阀|单向阀|背压阀厂家-上海沃原自控阀门有限公司 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 消泡剂_水处理消泡剂_切削液消泡剂_涂料消泡剂_有机硅消泡剂_广州中万新材料生产厂家 | 网站建设-高端品牌网站设计制作一站式定制_杭州APP/微信小程序开发运营-鼎易科技 | 众品家具网-家具品牌招商_家具代理加盟_家具门户的首选网络媒体。 | 蔬菜清洗机_环速洗菜机_异物去除清洗机_蔬菜清洗机_商用洗菜机 - 环速科技有限公司 | 警用|治安|保安|不锈钢岗亭-售货亭价格-垃圾分类亭-移动厕所厂家-苏州灿宇建材 | 气体热式流量计-定量控制流量计(空气流量计厂家)-湖北南控仪表科技有限公司 | 特种电缆厂家-硅橡胶耐高温电缆-耐低温补偿导线-安徽万邦特种电缆有限公司 | PTFE接头|聚四氟乙烯螺丝|阀门|薄膜|消解罐|聚四氟乙烯球-嘉兴市方圆氟塑制品有限公司 | 莱州网络公司|莱州网站建设|莱州网站优化|莱州阿里巴巴-莱州唯佳网络科技有限公司 | 快速门厂家-快速卷帘门-工业快速门-硬质快速门-西朗门业 | 沈阳真空机_沈阳真空包装机_沈阳大米真空包装机-沈阳海鹞真空包装机械有限公司 | 碎石机设备-欧版反击破-欧版颚式破碎机(站)厂家_山东奥凯诺机械 高低温试验箱-模拟高低温试验箱订制-北京普桑达仪器科技有限公司【官网】 | DWS物流设备_扫码称重量方一体机_快递包裹分拣机_广东高臻智能装备有限公司 | 河南新乡德诚生产厂家主营震动筛,振动筛设备,筛机,塑料震动筛选机 | 骨龄仪_骨龄检测仪_儿童骨龄测试仪_品牌生产厂家【品源医疗】 |