24点运算 js版本😄

907 阅读2分钟

题目描述

计算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');
字母最后替换再运算,待改