java - 某些组件的用途

标签 java arrays algorithm

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

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");
    }
}

最佳答案

  1. boolean[26]代表 26 个(英文)字母。如果您更改数组的大小,它可能仍然有效,具体取决于输入字符串及其包含的字符。您可能很幸运,只在 [0,length] 范围内拥有字符.
  2. 正如您首先看到的,字符串是大写的。然后您会注意到 A 是英文字母表 ASCII Unicode/UTF-16(有关 Java 字符的说明,请参阅@Edit2)字符表中的第一个字符。通过从 c 中减去它您会将字符从 Unicode 值 65-90 映射到字符数组范围 0-25(因为 A 的 65 - 65 = 0 和 Z 的 90 - 65 = 25)。同样,如果您将输入字符串小写,您将减去 a .

这是 Unicode table .你必须知道每个 char在Java中是用它来表示的(或者更准确地说,字符是由计算机用数字来表示的),所以最后Java的A65 Z90,因此您可以轻松减去它们。编译器仍然会提示您正在尝试访问 boolean使用 char 的数组值对于索引,这就是为什么你需要 (int) cast(你知道 justjavathings.org)。

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

@编辑:

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

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/

相关文章:

java - 我的媒体播放器启动了一个新实例而不是停止

java - `canvas.drawCircle`方法的半径是dp单位吗?

java - 为什么java中数组的大小有最大限制?

c - 使用 "="为内部的 char 数组分配结构有效吗?

php - 从 "Y-m-d H:i:s"格式的日期数组中获取最近的日期

java - 如何在 Java 中使用 Mockito 模拟 AWS API

c++ - 如何使用已删除的复制构造函数初始化类数组(C++11)

algorithm - 为什么线段树需要是满二叉树?

将 CSC 转换为 CSR 的算法复杂性

javascript - 在通用树中查找元素