Rain120 / Web-Study

日常学习,工作写的笔记
66 stars 108 forks source link

手写题-给加减乘除运算加括号(石墨二面) #17

Open Rain120 opened 2 years ago

Rain120 commented 2 years ago

现已知一个字符串是由正整数和加减乘除四个运算符(+ - /)组成。 例如存在字符串 const str = '11+2-34+5/24+10/5',现在需要将高优先级运算,用小括号包裹起来,例如结果为 '11+2-(34)+(5/2*4)+(10/5)'。注意可能会出现连续的乘除运算,需要包裹到一起。 请用 javascript 实现这一过程

// 11+2-(3*4)+(5/2*4)+(10/5)
cosnt str = '11+2-3*4+5/2*4+10/5';

cosnt addBrackets = (str) => {
    const res = [];
    const strArr = str.split('');
    let opening = false;
    let pos = 0;

    strArr.forEach((item, idx) => {
        if ('+-*/'.includes(item)) {
            if ('*/'.includes(item)) {
                if (!opening) {
                    opening = !opening;

                    for (var i = res.length - 1; i >= 0; i--) {
                        if (!(/\d/.test(res[i]))) {
                            pos = i;
                            break;
                        }
                    }
                    res.splice(pos + 1, 0, '(');
                }
            } else {
                if (opening) {
                    opening = !opening
                    res.push(')')
                }
            }

            res.push(item)
        } else if (/\d/.test(item)) {
            res.push(item)
        }
    });

    if (opening) {
        res.push(')')
    }

    return res.join('')
}

addBrackets(str);