Для чего из номера символа вычитается номер символа '0'?
Решала задачки на LeetCode, но не справилась с одной, посмотрела ответы.
Все они сами по себе работают одинаковым образом но как - непонятно :(
Сам алгоритм должен решать уравнение, переданное в виде строки на вход метода. То есть, s = "2+2*2" вернет 6
class Solution {
public int calculate(String s) {
Stack<Integer> stack = new Stack<>();
int curNum = 0;
char op = '+';
for (int i = 0; i < s.length(); i++) {
char chr = s.charAt(i);
if (Character.isDigit(chr)) curNum = curNum * 10 + (chr-'0');
if (!Character.isDigit(chr) && chr != ' ' || s.length()-1 == i) {
if (op == '-') stack.push(-curNum);
else if (op == '+') stack.push(curNum);
else if (op == '*') stack.push(stack.pop()*curNum);
else if (op == '/') stack.push(stack.pop()/curNum);
op = chr;
curNum = 0;
}
}
int res = 0;
while (!stack.empty()) res += stack.pop();
return res;
}}
Непонятно что делает 10 строка, для чего из номера символа вычитается номер символа '0'?
Ответы (2 шт):
Эта операция (вычитание "ноля" из символа) работает на уровне кодов этих же символов.
Конкретно в 10-ой строке происходит "сборка" рассматриваемого числа, то есть число формируется из разрядных слагаемых.
В данном случае, достаточно (вместо приведения символа к другому более привычном числовому типу) из кода рассматриваемого символа вычесть код ноля. Это необходимо, потому что в таблице символов ASCII нулевой символ имеет код 48. Соответственно, чтобы "сымитировать" цифру 0, необходимо сдвинуться на 48 позиций. И после этого символ умножается как необходимая цифра.
Все операнды в арифмитическом выражениии продвигаются минимум до int, поэтому, например, из '7' - '0' получится 55 - 48, что будет равно 7. Таким образом можно преобразовать символ '7' в число 7.
Или можно воспользоваться для этих целей готовым методом getNumericValue из класса Character.