首页 > 解决方案 > 将char放入int数组是什么意思,是ASC号吗?

问题描述

class Solution {
public boolean isIsomorphic(String s, String t) {
    
    int [] index_s = new int [128];//创建两个int数组128位,里面的值都为0
    int [] index_t = new int [128];
    
    for (int i =0; i<s.length(); i++){
        char sc = s.charAt(i); //取每一个位置上的字符
        char tc = t.charAt(i);
        
        if (index_s[sc] != index_t[tc]){
            return false ;
        }else{
            index_s[sc]=i+1;
            index_t[tc]=i+1;
        }
        
    }
    return true ;
    
    
}
}

从上面的代码来看,在int数组中,sc和tc都是char变量,那么这段代码是什么意思呢?

标签: java

解决方案


tl;博士

您的代码计算两个输入字符串中第 n 个字符匹配的出现次数,共享相同的 US-ASCII 数字(Unicode 代码点编号)。计数保存在一个数组中,其中索引表示所有 128 个可能的 US-ASCII 代码数字 (0-127)。该代码使用了一种技巧,charJava 中的类型实际上是一个 16 位整数。

您的代码适用String于其值仅包含 US-ASCII 字符的输入对象。如果输入包含以 Unicode 定义的任何其他 143,731 个字符,则您的代码将失败。

细节

正如Haddad 评论的那样,您的线条片段:

index_s[sc]
index_t[tc]

... 使用变量sctc,两者的类型都char好像它们是整数一样。这些整数值用作数组中从零开始的索引号以访问插槽。这是有效的,因为在 Java 中,char类型被视为整数。有关这种特殊语言特性的讨论,请参阅Can the char type be categories to an integer? .

Unicode代码点编号(与前 128 位的US-ASCII编号相同,因为 Unicode 是 US-ASCII 的超集)是从每个char. a作为 a的字母char实际上是一个 97 的十进制整数,其char值为b98,依此类推。

然后,您的代码继续增加int该数组插槽中的值。原始类型的数组int在每个槽中自动初始化为零。您的调用会=i+1增加该插槽的编号,从 0 到 1,然后从 1 到 2,依此类推。代码中的这种递增是对我们在输入字符串中遇到该代码点编号的频率的计数。

US-ASCII 数字从零开始,范围为 0-127。Java 中的数组索引也是从零开始的。所以不需要调整。NUL分配给 US-ASCII 数字的字符将0计入使用索引访问的数组槽中0

你的代码:

if (index_s[sc] != index_t[tc]){
            return false ;

...跳过两个输入字符串中的第 n 个字符是相同字符的情况,作为相同的代码点编号。

最后一行没有意义:return true ;. 总是返回true没有任何用处。

顺便说一句,该char类型现在已经过时,甚至无法表示 Unicode 中定义的一半字符。相反,您应该学习仅直接使用 Unicode 代码点int而不是char.


推荐阅读