任务:给定一个带有'*'或'/'的字符数组(称为运算符数组)和一个浮点数组,按运算符数组中字符的顺序乘/除数字。数组中的最后一个条目应包含最终答案,而其余索引为null。
假设您有1/2 * 3 * 4/5 * 6 数字数组将为[1.0,2.0,3.0,4.0,5.0,6.0],运算符数组将为[/,*,*,/,*]。我正在获取nums [i] = null行的索引错误,但我不明白为什么(因为如果我获取nums [i]的索引错误,为什么我没有获得nums [ i ++]?)。
ops是运算符数组,nums是数字数组。
for(int i = 0; i < ops.length; i++){
if(ops[i] == '*') {
nums[i++] = nums[i]*nums[i++];
nums[i] = null;
}else if(ops[i] == '/') {
nums[i++] = nums[i]/nums[i++];
nums[i] = null;
}
}
谢谢!
答案 0 :(得分:0)
显然,这不能解决操作顺序,但是由于您仅处理除法和乘法(它们是关联的),因此它仍然有效。
使用第一个数字初始化结果,然后循环遍历其余数字,并使用适当的运算符计算具有运行结果的当前数字。
public class Calculator {
public static void main(String[] args) {
double[] numbers = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 };
String[] operators = { "/", "*", "*", "/", "*" };
System.out.println(compute(numbers, operators)); // 1 ÷ 2 * 3 * 4 ÷ 5 * 6 = 7.2
}
private static double compute(double[] numbers, String[] operators) throws IllegalArgumentException {
if (operators.length != numbers.length - 1) {
throw new IllegalArgumentException("operator count must be one less than number count");
}
double result = numbers[0];
if (numbers.length > 1) {
for (int i = 1; i < numbers.length; i++) {
switch (operators[i - 1]) {
case "+":
result += numbers[i];
break;
case "-":
result -= numbers[i];
break;
case "*":
result *= numbers[i];
break;
case "/":
result /= numbers[i];
break;
}
}
}
return result;
}
}
答案 1 :(得分:0)
i++
返回表达式的i
值,然后在对表达式求值后以i
递增。
您最有可能想做的事:
for(int i = 0; i < ops.length; i++){
if(ops[i] == '*') {
nums[i+1] = nums[i]*nums[i+1];
nums[i] = null;
}else if(ops[i] == '/') {
nums[i+1] = nums[i]/nums[i+1];
nums[i] = null;
}
}
由于这些原因,您应该在应该i
之前进行递增。
阅读this,了解有关后缀/前缀增量(++)的更多信息。
答案 2 :(得分:0)
如果字符数组仅包含'*'或'/',则可以使用 下面的代码以减少代码行数
//Usage of Ternary Operator
for(int i = 0; i < ops.length; i++){
nums[i+1] = ops[i]=='*'? nums[i] * nums[i+1]: nums[i]/nums[i+1];
nums[i]=null;
}