我刚刚开始解决编码面试的问题。这是第一个问题:实现一个算法来确定字符串是否具有所有唯一字符。如果您不能使用其他数据结构怎么办? 这是解决方案: 使用布尔数组跟踪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而不是一个数字,所以我不知道它是如何工作的。我知道这是一个简单的问题,但我找不到直接的答案。希望你们能帮帮我。谢谢。
答案 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
。