题目描述:给定一个字符串,形如“1#3+1#0.4”,特殊字符有对应固定计算公式,其余与正常数学计算无异,返回计算结果。
字符串中包含!,@,#三种特殊字符,规定:
- !+!=0
- !+@=13
- !+#=4
- @+@=7
- @+#=20
- #+#=10
上述算式都满足交换率,算式中特殊字符成对出现,小数点不算特殊字符。
例如:1#3+1#0.4
输出:303.4
解析:原型其实是数字字符串(带小数位)加法,对于特殊字符,加一个函数收集特殊规定就可以了。有几个要点:
- 小数位补零
- 整数位前补零
- 模拟加法运算
import java.util.HashSet;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int len = sc.nextInt();
String s = sc.next();
String[] str = s.split("\\+");
if (str[0].length() == 0 && str[1].length() != 0) {
System.out.println(str[1].toString());
return;
}
if (str[0].length() != 0 && str[1].length() == 0) {
System.out.println(str[0].toString());
return;
}
if (str[0].length() == 0 && str[1].length() == 0) {
System.out.println();
return;
}
// 为小数位补零
int aLen = 0;
int bLen = 0;
String a = "";
String b = "";
if (str[0].contains(".")) {
String[] aArr = str[0].split(".");
aLen = aArr[1].length();
a = aArr[0] + aArr[1];//除去小数点后的字符串
} else {
aLen = 0;
a = str[0];
}
if (str[1].contains(".")) {
String[] bArr = str[1].split("\\.");
bLen = bArr[1].length();
b = bArr[0] + bArr[1];
} else {
bLen = 0;
b = str[1];
}
int maxLen = Math.max(aLen, bLen);//小数为的最大长度
for (int i = 0; i < maxLen - aLen; i++) {
a += "0";
}
for (int i = 0; i < maxLen - bLen; i++) {
b += "0";
}
//前补零
int lenMax = Math.max(a.length(), b.length());//总的最大长度
int lenMin = Math.min(a.length(), b.length());//总的最小长度
int zeroCount = lenMax - lenMin;
boolean flag = lenMin == a.length() ? true : false;
if(flag){
for(int i = 0; i < zeroCount; ++i){
a = "0" + a;
}
}else{
for(int i = 0; i < zeroCount; ++i){
b = "0" + b;
}
}
int temp = 0;
int carry = 0;
String res = "";
HashSet<Integer> set = new HashSet<>();
for (int i = 0; i <= 9; i++) {
set.add(i);
}
//如果不可以前补零的话,可以尝试双指针
for (int i = lenMax - 1; i >= lenMax - lenMin; i--) {
int aNum = a.charAt(i) - '0';
int bNum = b.charAt(i) - '0';
if (!set.contains(aNum)) {
temp = SepcialCal(a.charAt(i), b.charAt(i)) + carry;
} else {
temp = aNum + bNum + carry;
}
carry = temp / 10;
res = temp % 10 + res;
}
if (carry != 0) {
res = carry + res;
}
res = res.substring(0, res.length() - maxLen) + "." + res.substring(res.length() - maxLen);
System.out.println(res);
}
public static int SepcialCal(char c1, char c2) {
if (c1 == '!' && c2 == '!') {
return 0;
}
if (c1 == '!' && c2 == '@') {
return 13;
}
if (c1 == '@' && c2 == '!') { // 符合交换率
return 13;
}
if (c1 == '!' && c2 == '#') {
return 4;
}
if (c1 == '#' && c2 == '!') {
return 4;
}
if (c1 == '@' && c2 == '@') {
return 7;
}
if (c1 == '@' && c2 == '#') {
return 20;
}
if (c1 == '#' && c2 == '@') {
return 20;
}
if (c1 == '#' && c2 == '#') {
return 10;
}
return -1;
}
}