今晚刚笔试完,关于其中第三题,个人认为应该使用正则表达式解决,当然我做题老是超级费时间,所以当时没做出来,一直出错,现在自己找出了错误,将通过的代码记录一下,另外警醒自己写代码少犯错。关于match函数的用法也不熟练,输出结果是所有匹配项,这个一开始就错了。
题目具体说不全面了,说大致要求:
* +代表加法、*代表乘法、^代表自增;
* 要求括号匹配;运算符和数字之间以空格隔开;数字与数字之间用空格隔开;
* 在前面括号格式正确的情况下,后面又有独立的正确的括号,则输出最后的而结果;
* 格式不正确输出-1。
计算字符树的结果:
例如:(+ (+ 2 3)(^ 4)) 输出 10; (+ 2 3 ) 输出-1;
function compute(str){
let temp1 = "\\(\\^\\s(\\d)+\\)";
let temp2 = "\\([*|+]\\s(\\d)+(\\s(\\d)+)+\\)";
let reg1 = new RegExp(temp1,"g");
let reg2 = new RegExp(temp2,"g");
let y = str.match(reg1);
let z = str.match(reg2);
while(y !== null || z !== null) {
if(y){
for(let k0=0; k0<y.length; k0++){
let number0 = y[k0].match(/(\d)+/g);
let num = (+number0[0]);
num++;
let index0 = str.indexOf(y[k0]);
if(str[index0-1] == " "){
str = str.replace(y[k0],num);
}else{
str = str.replace(y[k0]," "+num);
}
}
}
//console.log(z[0]);
if(z){
for(let k1=0; k1<z.length; k1++){
let len = z[k1].length;
let flag = z[k1][1], sum;
if (flag == "+") {
let i = 0;
sum = 0;
let number1 = z[k1].match(/(\d)+/g);
//console.log(number[2]);
while (number1[i]) {
sum += (+number1[i]);
i += 1;
}
} else if (flag == "*") {
let j = 0;
sum = 1;
let number2 = z[k1].match(/(\d)+/g);
//console.log(number2);
while (number2[j]) {
sum *= (+number2[j]);
j++;
//console.log(sum);
}
}
//console.log(sum);
let index1 = str.indexOf(z[k1]);
if(str[index1-1] == " "){
str = str.replace(z[k1],sum);
}else{
str = str.replace(z[k1]," "+sum);
}
}
}
y = str.match(reg1);
z = str.match(reg2);
}
if(str.match(/^(\s(\d)+)+$/g)){
let y = str.match(/(\d)+$/g)
return y[0];
}
return -1;
}
console.log(compute("(+ 2 (+ 1 2))")); //5
console.log(compute("(^ (+ (+ 2 3 4)(* 1 2)))")); //12
console.log(compute("(^ (+ (* 2 3)(+ 1 2)))(+ 2 3)(^ 6)")); //7