Java,mask [s.charAt(i)]是什么意思? mask是一个布尔数组

时间:2014-12-17 22:51:39

标签: java boolean

我刚刚开始解决编码面试的问题。这是第一个问题:实现一个算法来确定字符串是否具有所有唯一字符。如果您不能使用其他数据结构怎么办? 这是解决方案: 使用布尔数组跟踪ASCII集中每个可能字符的出现。最初,该数组中的每个值都为false,直到出现相应的字符值。如果再次出现该字符值,则如果数组中的相应值已经为true,则返回false。 时间:O(n),n是字符串的长度。 空格:O(n),数组名为mask。 源代码:

public class Interview {

    // Assume every character in string is in ASCII.
    public boolean uniqueChars(String s) {
        boolean[] mask = new boolean[256];
        for (int i = 0; i < s.length(); i++) {
            if (mask[s.charAt(i)])
                return false;
            mask[s.charAt(i)] = true;
        }
        return true;
    }
} 

我无法理解这一点:mask [s.charAt(i)]。我认为s.charAt(i)是一个char而不是一个数字,所以我不知道它是如何工作的。我知道这是一个简单的问题,但我找不到直接的答案。希望你们能帮帮我。谢谢。

1 个答案:

答案 0 :(得分:2)

mask[s.charAt(i)]从索引s的{​​{1}}获取角色,将其转换为i(隐式),然后在int中查找值在mask数组中的那个索引处。字符的mask值是不是 ASCII,它是UTF-16(因为那是Java's characters are defined的方式)。代码产生大量假设(在注释中提到),该字符串只有ASCII字符,它显然定义为值为int的字符;这是“扩展”的ASCII,ASCII本身只定义字符< 256。对于值< 128,ASCII和UTF-16是相同的。

您的整体功能正在执行此操作:从包含所有< 128条目的数组开始(因为这是false的默认状态),它循环遍历字符串boolean[],并且每个角色,查看之前是否看过那个角色。如果有,则返回s函数(我们已经看到至少两次出现的字符)。如果之前没有看到过某个字符,它会将数组中的条目设置为true。如果它一直到字符串的末尾而不返回true,则返回true - 该字符串没有重复两次相同的字符。

如果代码看到的false值为ArrayIndexOutOfBoundsException的字符完全有可能,那么代码将失败并显示int