массив int но индексы это символы? - PullRequest
2 голосов
/ 05 января 2020

Я запутался, как можно получить целочисленный массив, пока индексы являются символами? Другая путаница заключается в том, что эта строка

if(i + 1 < N && nums[s[i+1]] > nums[s[i]])

- это строка, преобразуемая в целое число, которое затем сопоставляется с массивом чисел, аналогично хешированию его в индекс? `

 int romanToInt(string s) {
            const int N = s.length();
            int nums[128];
            nums['I'] = 1;
            nums['V'] = 5;
            nums['X'] = 10;
            nums['L'] = 50;
            nums['C'] = 100;
            nums['D'] = 500;
            nums['M'] = 1000;
            int result = 0;
            for(int i = 0; i < N; ++i)
            {
                if(i + 1 < N && nums[s[i+1]] > nums[s[i]])
                    result -=  nums[s[i]]; 
                else
                    result += nums[s[i]];
            }
            return result;
        }

Ответы [ 3 ]

6 голосов
/ 05 января 2020

Когда значение типа меньше int используется в арифметическом выражении c (как, например, в качестве оператора для оператора индекса массива), оно повышается to int.

Но учтите, что тип элемента массива и тип индекса на самом деле не связаны.

3 голосов
/ 05 января 2020

char на самом деле просто цифры. Это однобайтовые целые числа. У вас есть int s, у вас есть short s, и у вас есть char s.

Их числовое значение (которое вы можете наблюдать с помощью преобразования или продвижения в другой целочисленный тип, например int, затем распечатайте его out) является, когда инициализируется из символьного литерала, часто ASCII-кодом глифа в этом литерале. Массив индексов под go повышен до int, так что вы действительно используете int s. Здесь нет магов c.

Идея, что char s - это "символы", на самом деле не верна; просто многие функции форматирования / вывода обращаются с ними определенно так, что кажется, что они есть. «Символ» - это (по-разному) либо абстрактное понятие (например, символ Unicode U + 0056, который может быть представлен различными способами в зависимости от выбранной кодировки), либо форма глифа («буква A»); char не предоставляет ни одну из этих частей информации (символ литерал вроде как делает, как описано выше). У него плохое имя, но оно исходит от старины.

1 голос
/ 06 января 2020

В основном все символы представлены своими значениями ASCII, как и другие символы в C ++. Вы можете проверить таблицу ASCII здесь, нажав на эту ссылку https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html. Так, в этой строке кода nums ['V'] = 5 также можно записать как nums [86] = 5 как V в таблице ASCII обозначается как 86.

Дальнейшие числа [s [2]] ==, чтобы сказать числа [Значение ASCII символа в 3-й позиции в строке s]. Я надеюсь, что это полезно.

...