繁体   English   中英

破解编码面试:独特的字符(if块的工作)

[英]Cracking the coding Interview: Unique Character (Working of if block)

我想从下面的代码中了解 if 块的工作原理。 例如:如果我的字符串是摇滚,那么 ASCII 将是char_set[r] = 114 char_set[o] = 111 , char_set[c] = 99 , char_set[k] = 107 那么第一次当char_set[r] = 114会来if block 那么要检查什么? 由于char_set是布尔类型,所以它可能是真或假,但根据我的理解,最初char_set[r] = 114没有设置为真或假。 那么我们如何在 if 块中检查它是真还是假。 我查看了之前的相关问题,但我的问题不同,找不到任何内容。 这个问题取自《破解编码面试》一书。

public boolean isuniqueChars2(String str) {

       if (str.length() > 128) 
        return false;

    boolean[] char_set = new boolean[256];
    for (int i = 1; i < str.length(); i++)
    {
        int val = str.charAt(i);
        if (char_set[val]) {
            return false;
      }
        char_set[val] = true;
    }
    return true;
}

数组在创建时使用默认值进行初始化。 boolean类型的默认值为false

char_set作用是针对每个 ASCII 值,它存储一个boolean值,表示您之前是否见过该字符。

所以本质上,它是这样说的(有点伪代码):

for (every character in the string) {
    int val = str.charAt(i); //get the current character;
    if (char_set[val]) // if (we've seen the current character already)
        return false; // not made of unique characters
    char_set[val] = true; //store that we've seen the current character;
}
return true; // we got through all the characters, so it must now be unique.

真正发生的情况是,如果您的输入字符串是rock ,则char_set['r']truechar_set['o']char_set['c']char_set['k']

char_set的元素是boolean s。 当您创建数组时,它们都被初始化为该类型的默认值 ( false )。 其中一些元素的值可以在

        if (char_set[val]) //...

(产生类型的两个可能值中的一个boolean ,无论哪个是最近设置的),并可以被设置为true

        char_set[val] = true;

在每种情况下, val是所涉及元素的索引,而不是要设置或读取的值。

但是请注意,这段代码至少有两个重大问题:

  1. String.charAt()返回char类型的值,其数值范围可达65535 因此,提供的代码可以轻松生成ArrayIndexOutOfBoundsException

  2. String0开始索引,因此字符串中的第一个字符不包括在分析中。 从一般意义上讲,这可能是有意为之,但在“分析此代码”的意义上,认识到这一点很重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM