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;
}
答案 0 :(得分:3)
这意味着有人在做假设。您可以使用代表整数的字符来做到这一点: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};
设置数组{{1 }}设为0。
聚合初始化中的初始化程序不必具有值0。a
会将第一个元素(int a[26] = {3};
)设置为3,并将数组的其余元素设置为0。 / p>
聚合初始化不限于单个值。您可以根据需要使用任意多个值,并用逗号分隔。因此a[0]
会将前三个元素分别设置为1、2和3,其余所有元素都设置为0。而且如果初始化程序多于元素,则多余的将被忽略。
答案 1 :(得分:1)
通常,表达式(c
为char
)
c - 'a'
用于获取['a'
,'z'
]范围内的字符(由于其根源于英语字母,因此大小为26
),并为字母(例如'a'
是0
,'b'
是1
等)。
类似地,当您看到:
c - '0'
通常用于计算[0
,9
]范围内的字符的“数字”值,例如'5'
(字符)已映射到5
(整数)。
答案 2 :(得分:1)
1)a
是一个包含26个条目的数组,每个字母对应一个字母。但是字符'a'
的值不同于0,因此要获取数组的第n个字母,请执行s1[i]-'a'
。
2)int a[26] = {0}
在数组的第一个元素中放置一个零,然后默认初始化其余的元素(对于整数也意味着零,因此请注意,它不会执行您认为的操作),并且我会说改用std::vector<int> a(26, 0);
。您仍然可以使用int a[26] = {}
用0
对其进行初始化,并清楚地了解,您知道{0}仅将数组的第一个元素而不是整个数组初始化为该值:{{ 3}}
当然,该程序仅在仅输入小写字母时才起作用。如果输入了其他任何内容,则该程序的行为是不确定的,并且可能会崩溃。
答案 3 :(得分:1)
int a[26] = {0};
这只是初始化名为“ a”的数组中所有带有零的项。 当使用大括号初始化语法初始化内置类型的数组时,可能会发生两种类型的初始化。如果初始化程序少于数组大小,则使用相应的值初始化前N个元素,并使用默认构造函数初始化其余元素。对于内置类型,默认构造函数执行零初始化。
a[s1[i] - 'a']
内部char是简单的十进制数字。每个字符都有与之关联的唯一代码。 (请参见https://en.m.wikipedia.org/wiki/ASCII)
如果数组“ s1”包含小写拉丁文符号,则s[i]
在位置“ i”处使用符号。然后我们从符号s1[i]
的代码中减去符号'a'的代码,得到符号s1[i]
的字母数字(从零开始计数)。例如:'a'-'a' = 0
,'b' - 'a' = 1
然后,我们使用计算出的“数字”来访问数组“ a”中位于“数字”位置的元素
答案 4 :(得分:0)
a[s1[i] - 'a']
的{{1}}值中的减去'a'的ascii值将是s1[i]
的索引。确保a[]
大于字符的ascii值。
以及下面的内容,第一个元素将设置为0
s1[i]