Для чего из номера символа вычитается номер символа '0'?

Рейтинг: 0Ответов: 2Опубликовано: 19.02.2023

Решала задачки на 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'?

Ответы

▲ 1Принят

Эта операция (вычитание "ноля" из символа) работает на уровне кодов этих же символов.

Конкретно в 10-ой строке происходит "сборка" рассматриваемого числа, то есть число формируется из разрядных слагаемых.

В данном случае, достаточно (вместо приведения символа к другому более привычном числовому типу) из кода рассматриваемого символа вычесть код ноля. Это необходимо, потому что в таблице символов ASCII нулевой символ имеет код 48. Соответственно, чтобы "сымитировать" цифру 0, необходимо сдвинуться на 48 позиций. И после этого символ умножается как необходимая цифра.

▲ 2

Все операнды в арифмитическом выражениии продвигаются минимум до int, поэтому, например, из '7' - '0' получится 55 - 48, что будет равно 7. Таким образом можно преобразовать символ '7' в число 7.

Или можно воспользоваться для этих целей готовым методом getNumericValue из класса Character.