题目描述
计算24点是一种扑克牌益智游戏,随机抽出4张扑克牌,通过加(+),减(-),乘(*), 除(/)四种运算法则计算得到整数24,本问题中,扑克牌通过如下字符或者字符串表示,其中,小写joker表示小王,大写JOKER表示大王:
3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER
本程序要求实现:输入4张牌,输出一个算式,算式的结果为24点。
详细说明:
1.运算只考虑加减乘除运算,没有阶乘等特殊运算符号,友情提醒,整数除法要当心;
2.牌面210对应的权值为210, 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”表示无解。
输入描述:
输入4张牌为字符串形式,以一个空格隔开,首尾无空格;
输出描述:
如果输入的4张牌中包含大小王,则输出字符串“ERROR”,表示无法运算;
华为的算法面试 闲来做做
function count24 (str) {
if (str.indexOf('joker') > -1 || str.indexOf('JOKER') > -1){
return 'ERROR'
}
var arr = str.split(' ');
var targetSum = 0;
var allStrs = [];
arr.forEach((e,index) => {
switch(e){
case 'J':
arr[index] = 11;
break;
case 'Q':
arr[index] = 12;
break;
case 'K':
arr[index] = 13;
break;
case 'A':
arr[index] = 1;
break;
}
});
let arrAll = getallCase(arr);
for(let i =0;i<arrAll.length;i++){
let arr = arrAll[i].split('');
getallCase2(arr).forEach(function(e){
if (eval(e) === 24){
console.log(e);
}
});
}
}
function getallCase(array){
var allArr = [];
function allArrFn(str){
allArr.push(str);
}
function getall(index, arr,cb){
if (arr.length === 1){
cb && cb(arr[0]);
}
var start = String(arr[index]);
arr.splice(index,1);
for (var i=0; i< arr.length; i++){
let str2 = start + arr[i];
let arr2 = Object.assign([],arr);
arr2[i] = str2;
getall(i,arr2,cb);
}
}
for(var i =0;i<array.length;i++){
let arr = Object.assign([],array);
getall(i,arr,allArrFn);
}
return allArr
}
function getallCase2(array){
var allArr = [];
function allArrFn(str){
allArr.push(str);
}
function getall(index, arr,cb){
if (arr.length === 1){
cb && cb(arr[0]);
}
var start = String(arr[index]);
arr.splice(index,1);
for (var i=0; i< arr.length; i++){
for(let j = 0; j<4;j++){
let str2 = Calculator(j,start,arr[i]);
let arr2 = Object.assign([],arr);
arr2[i] = str2;
getall(i,arr2,cb);
}
}
}
for(var i =0;i<array.length;i++){
let arr = Object.assign([],array);
getall(i,arr,allArrFn);
}
return allArr
}
function Calculator (type, arr, Target) {
switch (Number(type)) {
case 0:
return arr + '+' + Target;
break;
case 1:
return arr + '-' + Target;
break;
case 2:
return arr + '*' + Target;
break;
case 3:
return arr + '/' + Target;
break;
}
}
好了,写了有点仓促。功能是对了😄
count24('2 3 4 6');
count24('A Q 3 4');
字母最后替换再运算,待改