我很困惑,当索引是字符时,怎么可能有一个整数数组?另一个困惑是这条线
if(i + 1 < N && nums[s[i+1]] > nums[s[i]])
将字符串转换为整数,然后将其映射到nums数组,类似于将其哈希为索引吗?`>
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;
}
我很困惑,当索引是字符时,怎么可能有一个整数数组?如果(i + 1
[在算术表达式中使用小于int
的类型的值(例如,作为数组索引运算符的运算符时,则为promoted至int
。
但是请注意,数组元素类型和索引类型并不是真正相关。
char
实际上只是数字。它们是一字节整数。您有int
个,也有short
个,也有char
个。
它们的数值(您可以通过转换或提升为另一种整数类型,例如int
来观察,然后将其打印出来),当从字符文字初始化时,通常是该文字中字形的ASCII码。数组索引升为int
,因此您实际上只是在使用int
。这里没有魔术。
char
是“字符”的概念并不是真的。只是许多格式化/输出函数对它们进行了专门的处理,因此看起来确实如此。 “字符”是(不同地)抽象概念(例如Unicode字符U + 0056,根据所选的编码可以用各种方式表示)或字形的形状(“字母A”); char
都不提供这些信息(如上所述,字符literal确实如此)。它的名字不好,但这来自过去。
基本上,所有字符都由其ASCII值表示,就像C ++中的其他符号一样。您可以通过单击此链接https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html在此处签出ASCII表。因此,在这行代码中nums ['V'] = 5也可以写为nums [86] = 5,因为V在ASCII中表示为86表格。