我只是开始解决破解编码面试中的问题。这是第一个问题:实施一种算法来确定字符串是否具有所有唯一字符。如果您不能使用其他数据结构怎么办?解决方案如下:使用布尔数组跟踪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而不是一个数字,所以我不知道它是如何工作的。我知道这是一个简单的问题,但我找不到直接的答案。希望你们能帮助我。非常感谢。
mask[s.charAt(i)]
从s
at索引处获取字符i
,将其转换为int
(隐式),然后mask
在mask
数组中的该索引处查找值。int
字符的值不是ASCII,而是UTF-16(因为这是Java字符的定义方式)。该代码做出了一个很大的假设(在注释中提到),该字符串仅包含ASCII字符,显然它被定义为值为的字符< 256
;这是ASCII的“扩展”,ASCII本身仅定义字符< 128
。对于值< 128
,ASCII和UTF-16相同。
您的总体功能是这样做的:从具有所有false
条目的数组开始(因为这是的默认状态boolean[]
),它循环遍历字符串,s
并针对每个字符查找是否以前看过该字符。如果有的话,请返回true
该函数(我们已经至少看到两次该字符)。如果以前没有看到字符,则将数组中的该条目设置为true
。如果它一直返回到字符串的末尾而没有返回true
,则返回false
-字符串没有重复两次相同的字符。
ArrayIndexOutOfBoundsException
如果看到的字符int
值为>= 256
,则代码将失败并显示,这很有可能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句