此问题要求您创建一个算法来确定字符串是否具有唯一字符。我一直在寻找解决方案,这似乎是我能找到的最简单的解决方案,但是这段代码中仍有一些部分我无法理解。
boolean[] chars = new boolean[26]; 编码器到底在做什么?这 26 个字符是否代表字母表中的 26 个字母。我问是因为当我摆弄代码并将值更改为 12、15、20 等时,程序仍然给出了正确的输出。
if(chars[(int)c - 'A']) 从int c中减去'A'的目的是什么?我在这个问题的多个解决方案中看到过这种减去“A”或“a”的方法,但我不明白它的用途是什么。
public class PracticeProblems {
public static void questionOne(String input) {
boolean[] chars = new boolean[26];
String upper = input.toUpperCase();
for(int i = 0, n = upper.length(); i < n; i++){
char c = upper.charAt(i);
if ('A' <= c && c <= 'Z'){
if(chars[(int)c - 'A']){
System.out.println("not unique");
return;
}
chars[(int)c - 'A'] = true;
}
}
System.out.println("unique");
}
public static void main(String[] args) {
questionOne("bil");
}
}
最佳答案
- 是
boolean[26]
代表 26 个(英文)字母。如果您更改数组的大小,它可能仍然有效,具体取决于输入字符串及其包含的字符。您可能很幸运,只在[0,length]
范围内拥有字符. - 正如您首先看到的,字符串是大写的。然后您会注意到 A 是英文字母表
ASCIIUnicode/UTF-16(有关 Java 字符的说明,请参阅@Edit2)字符表中的第一个字符。通过从c
中减去它您会将字符从 Unicode 值 65-90 映射到字符数组范围 0-25(因为 A 的 65 - 65 = 0 和 Z 的 90 - 65 = 25)。同样,如果您将输入字符串小写,您将减去a
.
这是 Unicode table .你必须知道每个 char
在Java中是用它来表示的(或者更准确地说,字符是由计算机用数字来表示的),所以最后Java的A是65, Z 为 90,因此您可以轻松减去它们。编译器仍然会提示您正在尝试访问 boolean
使用 char
的数组值对于索引,这就是为什么你需要 (int)
cast(你知道 justjavathings.org)。
请记住,此解决方案仅适用于英文字母表,不适用于其他字母表和/或其他 unicode 字符。为此,您要么需要更大的数组,要么将其更改为 Map<Character, Boolean>
.
@编辑:
要回答评论:您不需要比较单个字符,boolean
数组跟踪是否给定 char
是否已经在字符串中看到过。所以首先数组中的所有值都将设置为 false
因为您还没有看到任何字符。然后检查字符串的第一个字符,将其映射到 0-25 范围(我们称之为 idx)并将数组单元格设置为 idx
与 true
正如您刚刚看到的这个字符。然后正如您所看到的,每次迭代都首先检查当前字符是否已被看到:
if(chars[(int)c - 'A'])
如果此值设置为 true,则表示重复给定字符。
@编辑2:
正如 Tom Blodget 指出的那样,Java 字符不仅是 ASCII,而且(默认情况下)是 UTF-16(基本上只是从数字到给定字符的映射)。这意味着它们更多,但最后我上面所说的仍然适用 'A'-'A' = 0
然后后面的所有大写字符都彼此相邻所以 'B'-`A' = 1
等
关于java - 某些组件的用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25656544/