题目: 读取一个表达式,并输出用字符‘6’拼出的计算结果。相邻数字用两个英文句号‘.’间隔。
输入描述:
第一行为一个整数n,接下来n行,每行为一个表达式
对于30%的数据,表达式仅包含‘6’,‘+’,'-'三种字符
对于100%的数据,表达式仅包含'6',‘+’,'-',‘*’四种字符。
1
计算结果 在【-2^63, 2^63-1】范围内
最终结果在【0,2^63-1】范围内
输出描述:
对于每组数据,输出用字符‘6’拼出的计算结果。
样例:
输入: 2
6+6
6*6
输出: 是用字符'6'拼起来的 1 2 3 6
字符中间用两个'.'连接
下面是牛客网上有人分享的题解+我的注释,勉强看懂了他的代码(心疼自己)
importjava.util.ArrayList;
importjava.util.List;
importjava.util.Scanner;
publicclassMain {
publicstaticvoidmain(String[]args) {
Scannersc=newScanner(System.in);
intn= Integer.parseInt(sc.nextLine());
ArrayListlist=newArrayList();
Strings;
for(inti= 0;i
//每获取一行数据,调用下面两个方法。
s=sc.nextLine();
Longres=getRes(s);//计算这一行的 表达式的结果
list.add(res);//将这一行的结果放到 list里。
}
// System.out.println(list.get(0));
printRes(list);//将计算结果 用 带'6'的字符打印出来
}
privatestaticLong getRes(Strings) {
//初始化当前值 和 结果
longcur= 0l;
longsum= 0l;
//符号标志,用的很巧妙。
longsymbol= 1;
for(inti= 0;i
//将字符串表达式分解成 字符
charc=s.charAt(i);
//如何把 一个字符串的表达式 ,解析成 long型, 这段 是精髓
//如果该字符是数字,那么就把这个字符 转换成 long型,这步可能不好理解,但是很重要。
if(isDigital(c)) {
cur=cur* 10 +c-'0';
}elseif(c=='+') {//遇到 操作符+, 将之前的数据保存起来, cur从0开始
sum+=symbol*cur;
cur= 0;
symbol= 1;
}elseif(c=='-') {//遇到 操作符-, 将之前的数据保存起来, cur从0开始,将符号置为-1,在最后一步的时候用
sum+=symbol*cur;
cur= 0;
symbol= -1;
}else{
symbol*=cur;//遇到 操作符*,保存之前的数据,将它变为了symbol,再最后一步用。
cur= 0;
}
}
//如果是乘,其实 只有cur 和symbol有用
//如果是加或减, symbol 只能是1或者-1
returnsum+cur*symbol;
}
//判断该字符是不是数字,如果是'+'或者'-'或者'*',那么就返回false,否则返回true
privatestaticbooleanisDigital(charc) {
if(c=='+'||c=='-'||c=='*')
returnfalse;
returntrue;
}
//list里的元素,是 每一行的计算结果
publicstaticvoidprintRes(Listlist) {
//定义一个二维数组,
String[][]charNum= {{"66666","....6","66666","66666","6...6","66666","66666","66666","66666","66666"},
{"6...6","....6","....6","....6","6...6","6....","6....","....6","6...6","6...6"},
{"6...6","....6","66666","66666","66666","66666","66666","....6","66666","66666"},
{"6...6","....6","6....","....6","....6","....6","6...6","....6","6...6","....6"},
{"66666","....6","66666","66666","....6","66666","66666","....6","66666","66666"}};
for(inti= 0;i
for(intj= 0;j
//遍历list里的元素,将之转化为String类型,
Stringnum=list.get(j) +"";
for(intk= 0;k
//将每个元素的 字符 转换为index数字
intindex=num.charAt(k) -'0';
if(j==list.size() - 1 &&k==num.length() - 1)
continue;
}
}
}
}
}
上面的charNum这样子 比较好看
这个人写的getRes方法 是真的精髓,值得膜拜。
当然,printRes方法 也值得 细细品味。
但是 ,我觉得 这个作者写的有点高端了,感觉getRes方法 可以用比较讨巧的方式写。 先记在这吧,有机会再看这道题。
测试用例(一)
测试用例(二)
领取专属 10元无门槛券
私享最新 技术干货