Что означает вычитание «а» из элементов массива символов - PullRequest
0 голосов
/ 13 октября 2018

i> Что означает a [s1 [i] - 'a'] и ii> int a [26] = {0} (я не уверенно для инициализации каждого элемента массива значением 0)

 int main()
    {
        char s1[10010], s2[10010];
        cin >> s1 >> s2;
        int a[26] = {0};
        for(int i = 0; i < strlen(s1); i++)
            a[s1[i]-'a']++;
        for(int i = 0; i < strlen(s2); i++)
            a[s2[i]-'a']--;
        long long int ans = 0;
        for(int i = 0; i < 26; i++)
            ans += abs(a[i]);
        cout << ans << endl;
        return 0;

    }

Ответы [ 5 ]

0 голосов
/ 13 октября 2018

Это означает, что кто-то делает предположения.Вы можете сделать это с символами, которые представляют целое число: c - '0' даст вам целочисленное значение, соответствующее символу '0', '1', '2', ... '9'.Это гарантировано определением языка.Там нет такой гарантии для любых других значений символов.Таким образом, этот код предполагает , что c - 'a' выдаст числовое значение, которое каким-то образом отражает символ, который представляет c.В наиболее распространенных кодировках символов это работает;в ASCII, который является наиболее широко используемым, если c представляет строчную букву, то c - 'a' отображает 'a' в 0, 'b' в 1, ..., 'z' в 25.Но есть символьные представления, для которых это не так.

Обратите внимание, однако, что этот код не выполняет никакой проверки ввода.Если кто-то набрал «Z», «0» или «;»(чтобы назвать только несколько), результирующий индекс будет вне границ массива, и, вероятно, произойдут плохие вещи.

Что касается int a[26] = {0};, это называется агрегатная инициализация .Массив - это агрегат, то есть он содержит несколько значений.Инициализатор в форме {something} копирует something в первый элемент в совокупности и устанавливает остальные элементы в 0. Таким образом, int a[26] = {0}; устанавливает все 26 элементов массива a в 0.

Инициализатор в агрегатной инициализации не должен иметь значение 0. int a[26] = {3}; установит для первого элемента (a[0]) значение 3, а для остальных элементов массива - 0.

Совокупная инициализация не ограничена одним значением.Вы можете иметь столько значений, сколько хотите, разделенных запятыми.Таким образом, int a[26] = { 1, 2, 3 }; установит первые три элемента на 1, 2 и 3 соответственно, а все остальные на 0. И если инициализаторов больше, чем элементов, дополнительные игнорируются.

0 голосов
/ 13 октября 2018
int a[26] = {0};

это просто инициализация всех элементов в массиве с именем 'a' с нулями.При инициализации массива встроенных типов с синтаксисом фигурной инициализации могут иметь место два типа инициализации.Если инициализаторов меньше, чем размер массива, то первые N элементов инициализируются соответствующими значениями, а остальные элементы инициализируются с помощью конструктора по умолчанию.Для встроенных типов конструкторы по умолчанию выполняют инициализацию с нуля.

a[s1[i] - 'a']

Внутренние символы - это простые десятичные числа.Каждый символ имеет уникальный код, связанный с ним.(См. https://en.m.wikipedia.org/wiki/ASCII) Если массив "s1" содержит строчные латинские символы, тогда s[i] принимает символ в позиции "i". Затем мы вычитаем код символа 'a' из кода символа s1[i], получая алфавитное числосимвол s1[i] (считая с нуля). Например: 'a'-'a' = 0, 'b' - 'a' = 1 Затем мы используем вычисленное число для доступа к элементу в массиве «а» в позиции «число»

0 голосов
/ 13 октября 2018

1) a - это массив из 26 записей, по одной на каждую букву алфавита.Но символ 'a' имеет значение, отличное от 0, поэтому, чтобы получить n-ую букву массива, вы делаете s1[i]-'a'.

2) int a[26] = {0} ставит ноль в первом элементе массиваа затем default инициализирует все остальное (что означает также нули для целых чисел, так что имейте в виду, что оно не делает то, что вы думаете, что оно делает), и я бы сказал, вместо этого используйте std::vector<int> a(26, 0);.Вы все еще можете использовать int a[26] = {}, чтобы инициализировать его с 0 s и дать понять, что вы понимаете, что {0} будет инициализировать до этого значения только первый элемент массива, а не полный массив: http://www.cplusplus.com/doc/tutorial/arrays/

Конечно, эта программа работает, только если вводятся только строчные буквы.Если что-то еще будет введено, то поведение программы не определено и, вероятно, произойдет сбой.

0 голосов
/ 13 октября 2018

в a[s1[i] - 'a'] значение s1[i] минус значение ascii для 'a' будет индексом a[].убедитесь, что s1[i] больше, чем ascii значение символа.

и примерно ниже, первый элемент будет установлен 0

    int a[26] = {0};
0 голосов
/ 13 октября 2018

Обычно выражение (с c, равным char)

c - 'a'

используется для взятия символа в диапазоне ['a', 'z'] (который имеет размер 26, из-за его корней на английском алфавите) и вычисляет индекс для буквы (например, 'a', являющийся 0, 'b', являющийся 1 и т. Д.).


Аналогично, когда вы видите:

c - '0'

Обычно оно используется для вычисления «числового» значения символа в диапазоне [0, 9], например, '5' (символ)сопоставляется с 5 (целое число).

...