import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.math.BigInteger;
import java.util.*;
public class Main{
public static int i = 0;
public static char[] ch;
public static int len = 0;
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
HashMap<Integer,Integer> map = new HashMap<>();
String s = sc.nextLine();
ch = s.toCharArray();
len = ch.length;
System.out.println(Mymath());
}
public static long Mymath(){
long sum = 0;
while(true){
if(i >= len){
return sum;
}
if(ch[i] == '('){
i++;
sum += Mymath(); //有可能嵌套
}else if(ch[i] == ')'){
i++;
int a = 0;
while(i < len && ch[i] >='0' && ch[i] <= '9'){
a = a * 10 + ch[i] - '0';
i++;
}
if(a == 0){
a=1;
}
return sum * a;
}else{
int a = 0;
int count = ch[i] - 'A' + 1;
i++;
while(i < len && ch[i] >='0' && ch[i] <= '9'){
a = a * 10 + ch[i] - '0';
i++;
}
if(a == 0){
a=1;
}
sum += count * a;
}
}
}
}
对于这一题是值得自己去钻研的,因为一开始是没有头绪,然后想到用栈,但是用栈好像又太麻烦(如果有嵌套的话),所以借鉴了一下别人的代码,能看得懂,但是自己做的时候思路还不是很清晰,所以写一遍题解让自己加深一下印象。
首先,先定义一个全局变量的i,数组ch,数组长度len。接下来写一个方法,方法中要实现过滤符号,碰到数字要计算成功,还有一个就是最难想到的嵌套,嵌套看了之后恍然大悟,直接这一个ch如果是左括号,那么i++,然后进入嵌套方法,嵌套方法返回的就是一个数值,所以直接拿sum加上即可。如果碰到右括号,i++,判断最外面有没有数,如果有,直接sum相乘 即可return,注意了,这就是死循环的出口。
最后一个就是判断字母了,首先‘A’是1,一次类推,那么如果这一个字符正好是A那么count = ch[i] - 'A' + 1,就可以了,这样能保证每个得到的字母都是正确的。那么在每次计数时,都要把a重置,重置之后利用while判断,符合条件就在内循环。while里面的循环是防多位数(例如有 十个上百个A,都能算出来),算出来之后count X a就可以得到一个单词的数了。