题解 | #24点运算#
24点运算
http://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d
# 穷举法
1.将字符串先变成A-1,J-11,Q-12,k-13
2.取出两个数进行运算 返回运算结果并 和剩下的数进行运算
比如:1,2,3,4
1和2,3,4运算的结果 2和1,3,4运算的结果,3,4同理
已经取出了两个数了,还剩两个数遍历前面两个数运算的结果和第三个数在进行运算,
然后将前三个运算的结果和第四个数进行运算,找到第一次值等于24的值。
当第三次和第四次的结果等于24时,记录前两次的运算结果的值,反推运算。
比如 前三次的结果 * 4 == 24 那么前三次的结果肯定是6 这次运算就是*法
前两次的结果 * 3 == 6 那么前两次的结果肯定是2 这次运算就是*法
第一个值和第二个值是知道的 那么 num1(1) ? num2(2) == 2呢? 这次运算就是*法
let line
let flag = false
function getArr(idot){
var num = 0;
if(idot == 'A'){
num = 1
}else if(idot == 'J'){
num = 11
}else if(idot == 'Q'){
num = 12
}else if(idot == 'K'){
num = 13
}else{
num = Number(idot)
}
return num
}
function replaceIdot(idot){
var str = '';
if(idot == 1){
str = 'A'
}else if(idot == 11){
str = "J"
}else if(idot == 12){
str = 'Q'
}else if(idot == 13){
str = 'K'
}else{
str = idot + ''
}
return str
}
function calc(num1,num2){
return [num1+num2,num1-num2,num1*num2,num1/num2]
}
// 因为是循环嵌套所以外部声明变量得到num3
let numThree = null
let legoTempOutside = null
function getCalc(arr,lego,num1,num2){
let res = []
let operate = []
for(let i = 0;i<lego.length;i++){
for(let j = 0;j<arr.length;j++){
let newArr = JSON.parse(JSON.stringify(arr));
newArr.splice(j,1);
res = calc(lego[i],arr[j]);
if(newArr.length > 0){
numThree = arr[j]
legoTempOutside = lego[i]
getCalc(newArr,res,num1,num2)
}else{
if(res.indexOf(24) > -1 ){
let num3 = numThree
let num4 = arr[j]
let step = 0
let legoTemp = legoTempOutside
// console.log(num1,num2,num3,num4)
if(lego[i] + num4 == 24){
operate.push('+')
}else if(lego[i] - num4 == 24){
operate.push('-')
}else if(lego[i] * num4 == 24){
operate.push('*')
}else if(lego[i] / num4 == 24){
operate.push('/')
}
if(legoTemp + num3 == lego[i]){
operate.unshift('+')
}else if(legoTemp - num3 == lego[i]){
operate.unshift('-')
}else if(legoTemp * num3 == lego[i]){
operate.unshift('*')
}else if(legoTemp / num3 == lego[i]){
operate.unshift('/')
}
if(num1 + num2 == legoTemp){
operate.unshift('+')
}else if(num1 - num2 == legoTemp){
operate.unshift('-')
}if(num1 * num2 == legoTemp){
operate.unshift('*')
}if(num1 / num2 == legoTemp){
operate.unshift('/')
}
if(!flag){
// console.log(operate)
console.log(replaceIdot(num1) + operate[0] + replaceIdot(num2) + operate[1] + replaceIdot(num3) + operate[2] + replaceIdot(num4));
}
flag = true
break;
}
}
}
if(flag){
break;
}
}
return res
}
function getRes(arr){
for(let i = 0;i<arr.length;i++){
let newArr = JSON.parse(JSON.stringify(arr));
let num1 = newArr.splice(i,1);
for(let j =0;j<newArr.length;j++){
let newArr1 = JSON.parse(JSON.stringify(newArr));
let num2 = newArr1.splice(j,1);
// 取两个数进行运算剩下的数载进行运算
let res = calc(arr[i],newArr[j]);
getCalc(newArr1,res,Number(num1),Number(num2))
if(flag){
break
}
}
if(flag){
break
}
}
}
while(line = readline()){
flag = false
if(line.includes('joker')|| line.includes('JOKER')){
console.log('ERROR')
}else{
let arr = line.split(' ').map(i=>getArr(i));
getRes(arr);
if(!flag){
console.log('NONE')
}
}
}