华为算法题1:

/**
 * 计算24点是一种扑克牌益智游戏,随机抽出4张扑克牌,通过加(+),减(-),乘(*), 除(/)四种运算法则计算得到整数24,本问题中,扑克牌通过如下字符或者字符串表示,其中,小写joker表示小王,大写JOKER表示大王: 
 * 3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER
 * 本程序要求实现:输入4张牌,输出一个算式,算式的结果为24点。 
 * 详细说明: 
 * 1.运算只考虑加减乘除运算,没有阶乘等特殊运算符号,友情提醒,整数除法要当心; 
 * 2.牌面2~10对应的权值为2~10, J、Q、K、A权值分别为为11、12、13、1; 
 * 3.输入4张牌为字符串形式,以一个空格隔开,首尾无空格;如果输入的4张牌中包含大小王,则输出字符串“ERROR”,表示无法运算; 
 * 4.输出的算式格式为4张牌通过+-*\/四个运算符相连,中间无空格,4张牌出现顺序任意,只要结果正确; 
 * 5.输出算式的运算顺序从左至右,不包含括号,如1+2+3*4的结果为24
 * 6.如果存在多种算式都能计算得出24,只需输出一种即可,如果无法得出24,则输出“NONE”表示无解。
 */

let arr = [];
+function(){Array.prototype.remove = function(val) {let index = this.indexOf(val);if(index > -1) {this.splice(index, 1);}}// 输入四张牌let n1 = '4 2 K A';let list = n1.split(' ');// 四张牌转换数字list = trans(list);// 做4次拆解,每次将最后一位数字放到第一位d('', list);for(let i=0; i< list.length-1; i++) {d('', turn(list));}if(arr.length == 0) {print('NONE');}else {print(arr[0]);}
}();function trans(list) {// 转化牌面 转为数字return list.map(val => {if(val == 'J') {return 11;}else if(val == 'Q') {return 12;}else if(val == 'K') {return 13;}else if(val == 'A') {return 1;}else {return Number(val);}});
}// 将数组最后一位数字放到第一位
function turn(list) {list.unshift(list[list.length-1]);list.splice(-1);return list;
}// 计算
function d(str, list_) {let can = false;// 浅拷贝数组let list = [...list_];// 锁住数组第一个参数let a = list[0];// 其余数字做新数组遍历list.remove(a);if(list.length > 2) {// 当数组超过2个,做递归d(`${str} ${a}`, list);for(let i=0; i< list.length-1; i++) {d(`${str} ${a}`, turn(list));}}else {// 当数组减少到只剩2个数字,开始排列// 将之前截取的数字拼起来let l1 = `${str} ${a}`.trim().split(' ');let l2 = [...l1];// 排列1l1.push(list[0]);l1.push(list[1]);can = y1(l1);if(!can) {// 排列2l2.push(list[1]);l2.push(list[0]);can = y1(l2);}}return can;
}function y1(list) {// 四张牌运算// 运算法则let soul = ['+', '-', '*', '/'];let a = list[0];let b = list[1];let c = list[2];let d = list[3];let can = false;// 锁住第一个数字位置for(let i=0; i< 4 && !can; i++) {// 锁住第二个数字位置for(let j=0; j< 4 && !can; j++) {// 锁住第三个数字位置for(let k=0; k< 4 && !can; k++) {// 穷举处理括号let s = `${a}${soul[i]}${b}${soul[j]}${c}${soul[k]}${d}`;let s1 = '', s2 = '', s3 = '';if(i == 0 || i == 1) {if(j ==0 || j == 1) {if(k == 0 || k == 1) {}else {s1 = `(${a}${soul[i]}${b}${soul[j]}${c})${soul[k]}${d}`;}}else {if(k == 0 || k == 1) {s1 = `(${a}${soul[i]}${b})${soul[j]}${c}${soul[k]}${d}`;s2 = `(${a}${soul[i]}${b})${soul[j]}(${c}${soul[k]}${d})`;s3 = `${a}${soul[i]}${b}${soul[j]}(${c}${soul[k]}${d})`;}else {s1 = `(${a}${soul[i]}${b})${soul[j]}${c}${soul[k]}${d}`;}}}else {if(j ==0 || j == 1) {if(k == 0 || k == 1) {s1 = `${a}${soul[i]}(${b}${soul[j]}${c})${soul[k]}${d}`;s2 = `${a}${soul[i]}(${b}${soul[j]}${c}${soul[k]}${d})`;}else {s1 = `(${a}${soul[i]}${b}${soul[j]}${c})${soul[k]}${d}`;s2 = `${a}${soul[i]}(${b}${soul[j]}${c}${soul[k]}${d})`;s3 = `${a}${soul[i]}(${b}${soul[j]}${c})${soul[k]}${d}`;}}else {if(k == 0 || k == 1) {s1 = `${a}${soul[i]}${b}${soul[j]}(${c}${soul[k]}${d})`;}}}// 计算总和let sum = eval(s);let sum1 = s1 != ''? eval(s1) : 0;let sum2 = s2 != ''? eval(s2) : 0;let sum3 = s3 != ''? eval(s3) : 0;if(sum == 24) {// print(s);arr.push(s);can = true;}if(sum1 == 24) {// print(s1);arr.push(s1);can = true;}if(sum2 == 24) {// print(s2);arr.push(s2);can = true;}if(sum3 == 24) {// print(s3);arr.push(s3);can = true;}}}}return can;
}function print(msg) {console.log(msg)
}

使用穷举法,因为边工作边写的,还有细节待完善,Joker这些还没写,准备做一个24点小游戏的Electron

【JavaScript】计算24点相关推荐

  1. c#和javascript分别轻松实现计算24点

    24点游戏介绍:给出4个1-9之间的整数(ms我当年玩的时候是用扑克牌),其中每个数字必须且只用一次:任意使用+-*/ ( ),构造出一个表达式,使得最终结果为24,这就是常见的算24点的游戏(我的老 ...

  2. JS、javascript计算两个时间差

    其实,javascript计算时间差的方式非常简单,如果是默认的Date()类型,直接相减就是相差的毫秒数. Date型 var d1 = new Date('2016/03/28 10:17:22' ...

  3. javaScript 计算两个日期的天数相差~~~

    一:计算两个日期相差的天数 比如:    str1  =  "2002-01-20"    str2  =  "2002-10-11"   怎样用javaScr ...

  4. html 表格自动计算,HTML表格中的JavaScript计算

    我是 JavaScript的新手,所以我甚至不知道这是否是尝试这个的正确语言,但我想我会尝试.我已经阅读了其他几篇文章,我找不到真正让我知道如何做到这一点的东西,所以我在这里问.我读过的所有例子都涉及 ...

  5. 24点游戏java_使用java编写计算24点游戏程序

    初学java,编写了一个计算24点的程序,时间有限,有些粗糙,不过可以使用. //-------------Cal24.java--------------- //计算24点程序 //作者:徒步天下( ...

  6. 计算机公式求时间差公式,24时间差计算公式 excel中计算24小时

    excel中计算24小时制时间差 怎样在excel中计算24小时制时间差,在一天之内的小编会,不过不在一天之内外套一个MOD函数,就行了,这样试试 =MOD("0:36"-&quo ...

  7. 1224 红魔馆的纸牌游戏 (计算24点,dfs)

    Description 红魔馆的蕾米莉亚大小姐一天发现人类有一种叫做24点的游戏,于是就带着一副不知哪里弄来的扑克牌到图书馆找帕秋莉玩 24点游戏的规则:从一副牌中随机抽取4张牌,牌的点数为1到13之 ...

  8. 阿里云云计算 24 SLB的概念

    阿里云云计算 24 SLB的概念 参考 https://edu.aliyun.com/lesson_547_21891#_21891

  9. ArcGIS API for JavaScript 3.24 文字标注的添加和带背景的文字添加

    说明:本人是一个gis小白,由于网上的资料过于专业,当时学习的时候经常看不懂,于是写了一些简单的关于ArcGIS Api for javaScript分享,若该分享中出现错误,希望大家指出,若能帮助到 ...

最新文章

  1. R语言一键批量完成差异统计和可视化
  2. 【文本分类】基于BERT预训练模型的灾害推文分类方法、基于BERT和RNN的新闻文本分类对比
  3. django中自定义标签和过滤器
  4. mysql延迟判断模板
  5. algid parse error, not a sequence错误
  6. 【阿里云域名】我都有服务器了,为什么还要购买域名?
  7. 【软件工程】数据流图初探
  8. linux 自动安装mysql数据库_Linux安装MySql数据库
  9. 小公司出身的我,是如何拿下知名独角兽公司 Offer?
  10. Vue-watch侦听器和计算属性
  11. 机房重构(4)——触发器的使用
  12. WP中Document的层次设计
  13. 微课有关计算机应用基础,【计算机仿真论文】微课在计算机应用基础课的应用(共3802字)...
  14. 如何使用IntelliJ IDEA中自带的mvn命令
  15. 计算机软件设计费计算标准,水利工程咨询、勘测设计费收费标准及计算程序
  16. vue扫码跳转页面_VUE 网页 扫码登录(微信)
  17. 零信任嵌入式安全沙箱技术,企业应用软件的技术底座
  18. Gromacs 的第一步_能量最小化
  19. 我哋嘅水墨动剐曾让宫祈骏、糕填勋睇木殳咗2019年6月25日 星期二
  20. 微信H5页面源码如何看

热门文章

  1. 为什么天才容易患阅读障碍症_为什么阅读障碍症反而有助于成功
  2. element 菜单修复02-王荣荣如此唯美
  3. 3D点云重建0-04:MVSNet-白话给你讲论文-翻译无死角(2)
  4. 第三阶段学习心得总结
  5. 第一期•第2场“走进数字艺术商品,福利不停歇”活动将于5月9日开启
  6. 【tyvj1032】零用钱
  7. iphone 录音与播放同时 音量问题
  8. 全志R11 Tina2.5 交叉编译器介绍-SDK
  9. 五月训练第一天——数组
  10. 【ENVI条件下的GF6-WFV数据处理】