某些组件的目的

时间:2014-09-04 02:44:47

标签: java arrays algorithm

此问题要求您创建算法以确定字符串是否具有唯一字符。我正在寻找解决方案,这似乎是我能找到的最简单的解决方案,但是这段代码仍有一部分我无法解决。

boolean [] chars = new boolean [26]; 编码器到底在做什么? 26个字符代表字母表中的26个字母。我问,因为当我摆弄代码并将值更改为12,15,20等时,程序仍然提供了正确的输出。

if(chars [(int)c - ' A'])减去' 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");
    }
}

1 个答案:

答案 0 :(得分:6)

  1. boolean[26]代表26个(英文)字母。如果更改数组的大小,它可能仍然有效,具体取决于输入字符串及其包含的字符。你可能只是幸运地在[0,length]范围内拥有字符。
  2. 你可以看到首先字符串是upperCased。然后您可以注意到 A ASCII Unicode / UTF-16中的第一个字符(有关Java char的说明,请参阅@ Edit2)字母表中的字母表。通过从c中减去它,你将把你的字符从Unicode值65-90映射到字符数组范围0-25(因为A的65-65 = 0,Z的90-65 = 25)。同样,如果您对输入字符串进行lowerCase,则会减去a
  3. 这是Unicode table。您必须知道Java中的每个char都用它来表示(或者更精确的字符由计算机用数字表示),所以最后 A for Java是< strong> 65 , Z 90 ,因此您可以轻松地减去它们。编译器仍会抱怨您尝试使用boolean索引来访问char数组值,这就是您需要(int)强制转换(您知道justjavathings.org)的原因。

    请记住,此解决方案仅适用于英文字母,而不适用于其他字母和/或其他unicode字符。为此,您需要更大的更改数组到Map<Character, Boolean>

    @Edit:

    要回答评论:您不需要比较单个字符,boolean数组会跟踪字符串中是否已显示给定的char。因此,首先,数组中的所有值都将设置为false,因为您还没有看到任何char。然后检查字符串的第一个字符,将其映射到0-25范围(让我们称之为idx)并将{1}}的数组单元设置为idx,因为您刚看​​到此字符。然后你可以看到每次迭代都是先检查当前的char是否已被看到:

    true

    如果此值设置为true,则表示重复给定的字符。

    @ Edit2:

    正如Tom Blodget所指出的,Java字符不仅是ASCII,而且(默认情况下)UTF-16(基本上只是从数字到给定字符的映射)。这意味着它们中有更多,但最后我上面所说的仍然是if(chars[(int)c - 'A']) ,然后所有后面的大写字符彼此相邻,所以'A'-'A' = 0等。