【问题标题】:int array but the indices are characters?int 数组但索引是字符?
【发布时间】:2020-04-23 11:20:35
【问题描述】:

我很困惑,当索引是字符时,怎么可能有一个整数数组? 另一个困惑是这一行

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;
        }

【问题讨论】:

  • 字符文字可以转换为整数。顺便说一句,所有内容都以数字形式存储在计算机中。
  • 顺便说一下,您的代码有未定义的行为,因为您使用了nums 的未初始化元素。未初始化的变量(或数组元素)将具有 indeterminate (并且看似随机/垃圾)值,并且使用这些值会导致所述未定义行为。
  • "是要转换的字符串":注意这里的索引不是字符串。它是一个(单个)字符。它不适用于字符串作为索引。没有任何涉及的散列。
  • @sanjep s 是一个字符串,所以s[i+1] 是一个字符,而不是一个字符串。
  • @Someprogrammerdude 他真的使用未初始化的元素吗?我对此表示怀疑,除非输入字符串包含 IVXLCDM 以外的内容。但在这种情况下,您还应该警告他基本 ASCII 以外的字符低于 0 或高于 127,具体取决于是否对普通字符进行了签名。

标签: c++ algorithm hash


【解决方案1】:

当在算术表达式中使用小于int 类型的值时(例如作为数组索引运算符的运算符),它是promotedint

但请注意,数组元素类型和索引类型并不真正相关。

【讨论】:

  • 例如 nums['I'] = 1 ,可能等于 nums[20] = 1 然后 nums[s[i]] 将是 nums[20]=1 这将给出 1
  • @sanjep 完全正确。
【解决方案2】:

chars 实际上只是数字。它们是单字节整数。你有ints,你有shorts,你有chars。

当从字符文字初始化时,它们的数值(您可以通过转换或提升到另一个整数类型(如int)来观察,然后将其打印出来)通常是该文字中字形的 ASCII 码。数组索引会升级到int,所以你实际上只是在使用ints。这里没有魔法。

chars 是“字符”的概念并不是真的;只是许多格式化/输出函数对它们进行了专门处理,因此看起来就像它们一样。 “字符”(不同地)是抽象概念(例如,Unicode 字符 U+0056,可以根据所选编码以多种方式表示)或字形的形状(“字母 A”); char 不提供这些信息(如上所述,字符 literal 可以提供)。它有一个坏名字,但它来自过去。

【讨论】:

    【解决方案3】:

    基本上所有字符都由它们的 ASCII 值表示,就像 C++ 中的其他符号一样。 您可以通过单击此链接https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html在此处查看 ASCII 表。因此,在这行代码中,nums['V'] = 5 也可以写为 nums[86]=5,因为 V 在 ASCII 中表示为 86表。

    Further nums[s[2]]==to say nums[字符串 s 中第 3 位字符的 ASCII 值]。 我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-09-18
      • 2019-08-12
      • 1970-01-01
      • 2014-12-02
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      相关资源
      最近更新 更多