Java 处理一系列加减运算的方法
我正在编写一个java方法,它接受一系列加减运算,例如 “+1+2+3-5”,我希望它返回答案的整数 我正在尽可能有效地做这件事。我尝试了Java 处理一系列加减运算的方法,java,operators,Java,Operators,我正在编写一个java方法,它接受一系列加减运算,例如 “+1+2+3-5”,我希望它返回答案的整数 我正在尽可能有效地做这件事。我尝试了String.split()方法,但它会稍微混淆加号和减号 有人能帮忙吗?不,这不是家庭作业。您需要逐个字符解析字符串。差不多 int foo(String s){ int total = 0; String currentNum = "" for(int i =0;i<s.length;i++){
String.split()
方法,但它会稍微混淆加号和减号
有人能帮忙吗?不,这不是家庭作业。您需要逐个字符解析字符串。差不多
int foo(String s){
int total = 0;
String currentNum = ""
for(int i =0;i<s.length;i++){
if(s[i] =="+"){
total += Integer.parseInt(currentNum);
currentNum = ""
}else if(s[i] =="-"){
total -= Integer.parseInt(currentNum);
currentNum = ""
}else{
currentNum += s[i]
}
}
return total;
}
intfoo(字符串s){
int-total=0;
字符串currentNum=“”
对于(inti=0;i您需要逐个字符解析字符串
int foo(String s){
int total = 0;
String currentNum = ""
for(int i =0;i<s.length;i++){
if(s[i] =="+"){
total += Integer.parseInt(currentNum);
currentNum = ""
}else if(s[i] =="-"){
total -= Integer.parseInt(currentNum);
currentNum = ""
}else{
currentNum += s[i]
}
}
return total;
}
intfoo(字符串s){
int-total=0;
字符串currentNum=“”
对于(inti=0;i嗯,有几件事需要考虑
- 您可能会使用split来帮助解析,但是您需要分隔符和数字
- 您可以扫描字符串,记住当前数字的起始位置,然后在找到结尾时对其进行解析
- 解析字符串后,您将使用什么数据结构来存储它?
<> LI>你可能想考虑减法20就像添加-20…
- …或者您可能想考虑在数字和运算符之间交替,如果第一个字符不是“-”,则以隐式“+”开头
<> LI>您应该强烈考虑将任务分解为“解析”和“评估”阶段。特别是,即使没有编写任何解析代码,也应该能够编写评估阶段的测试,反之亦然。
你说你想尽可能高效地做到这一点-为什么?效率通常(但肯定不总是)是清晰的敌人。我至少会先尝试一个清晰的解决方案,然后再确定它的效率。通常清晰的解决方案“足够有效”
好吧,有几件事需要考虑
- 您可能会使用split来帮助解析,但是您需要分隔符和数字
- 您可以扫描字符串,记住当前数字的起始位置,然后在找到结尾时对其进行解析
- 解析字符串后,您将使用什么数据结构来存储它?
<> LI>你可能想考虑减法20就像添加-20…
- …或者您可能想考虑在数字和运算符之间交替,如果第一个字符不是“-”,则以隐式“+”开头
<> LI>您应该强烈考虑将任务分解为“解析”和“评估”阶段。特别是,即使没有编写任何解析代码,也应该能够编写评估阶段的测试,反之亦然。
- 你说你想尽可能高效地做到这一点-为什么?效率通常(但肯定不总是)是清晰的敌人。我至少会先尝试一个清晰的解决方案,然后再确定它的效率。通常清晰的解决方案“足够有效”
这是您在这里需要的,在Java中应该很容易实现。这是您在这里需要的,在Java中应该很容易实现。一般来说,对于这些类型的问题,您需要一个二叉树。但是,您的情况更简单,可以使用正则表达式
Pattern pattern = Pattern.compile("([+-]?)([\\d]+)");
String str = "+10-3+20-10-20";
Matcher m = pattern.matcher(str);
while (m.find()) {
System.out.println(m.group(1));
System.out.println(m.group(2));
}
这段代码为您提供了所有符号(组(1)
)和所有数字(组(2)
)
现在,您应该只使用适当的if子句来完成while循环。通常,对于这些类型的问题,您需要一个二叉树。但是,您的情况更简单,并且可以使用regex
Pattern pattern = Pattern.compile("([+-]?)([\\d]+)");
String str = "+10-3+20-10-20";
Matcher m = pattern.matcher(str);
while (m.find()) {
System.out.println(m.group(1));
System.out.println(m.group(2));
}
这段代码为您提供了所有符号(组(1)
)和所有数字(组(2)
)
现在,您应该只使用适当的if子句来完成while循环。我将首先在加号上拆分。在您的示例中,您将得到“1”、“2”和“3-5”,然后通过在减号上拆分来处理它们。我将首先在加号上拆分。在您的示例中,您将得到“1”、“2”和“3-5”然后通过在减号上拆分来处理每一个问题。我看到了RHicke的伪代码,并对其进行了处理。这是一个非常适合我的解决方案。虽然他的帖子在正确的轨道上,但它缺少了一些东西,例如处理最后一个数字和一些其他在代码中显而易见的东西
public static int parser(char[] s){
int total = 0;
String currentNum = "";
String currentProc = "none";
for(int i = 0; i < s.length; i++){
if(s[i] =='+'){
if(currentProc == "none"){
total = Integer.parseInt(currentNum);
currentNum = "";
}
else if(currentProc == "plus"){
total += Integer.parseInt(currentNum);
currentNum = "";
}
else{
total -= Integer.parseInt(currentNum);
currentNum = "";
}
currentProc = "plus";
}else if(s[i] =='-'){
if(currentProc == "none"){
total = Integer.parseInt(currentNum);
currentNum = "";
}
else if(currentProc == "plus"){
total += Integer.parseInt(currentNum);
currentNum = "";
}
else{
total -= Integer.parseInt(currentNum);
currentNum = "";
}
currentProc = "minus";
}else{
currentNum += s[i];
}
}
if(currentProc == "plus"){
total += Integer.parseInt(currentNum);
}
else{
total -= Integer.parseInt(currentNum);
}
return total;
}
publicstaticint解析器(char[]s){
int-total=0;
字符串currentNum=“”;
字符串currentProc=“无”;
对于(int i=0;i
我看到了RHicke的psuedocode,然后把它弄得乱七八糟。这里有一个非常适合我的解决方案。虽然他的帖子在正确的轨道上,但它有一个