【问题标题】:Questions:Implement an algorithm to determine if a string has all unique characters. What if you cannot use additional data structure问题:实现一个算法来确定一个字符串是否具有所有唯一字符。如果你不能使用额外的数据结构怎么办
【发布时间】:2014-10-12 15:21:12
【问题描述】:

解决方案:

public boolean isUniqueChars2(String str) {
    if (str.length() > 256) return false;
    boolean[] char_set = new boolean[256];
    for (int i = 0; i< str.length(); i++) {
        int val = str.charAt(i);
        if (char_set[val]) {
            return false;
        }
        char_set[val] = true;
    }
    return true;
}

我有一些问题:

  1. 编码是基于给定字符串是ASCII字符串的前提,如果是Unicode字符串怎么办? ASCII字符串和Unicode字符串有什么区别?

  2. int val=str.charAt(i) 我搜索了ASCII表,

如果字符串是“@ABCD”,会返回什么数字?(使用“Dec, Hx, Oct”这三个中的哪一个?)

  1. str.charAt(i) 应该返回一个字符(例如 A),为什么将数据类型声明为 int 可以直接将字符转换为相应的 ASCII 表的数字?

【问题讨论】:

  • ASCII 只有 128 个字符。您必须从几十个最多 256 个字符的其他字符集中获得 256 个字符。
  • Unicode 有很多细微差别。该标准指的是“字素”的概念,这可能是您所认为的“字符”。需要思考的一些问题:您是否想将带有重音 ("\u00E1") 的 'a' 与带有重音 ("\u0061\u0301") 的 'a' 相同,并且两者都不同于不带重音的 'a'重音(“\u0061”)?如果是这样,你必须规范化。您想处理需要两个 Java chars 编码的代码点吗?音乐符号八分音符???? ("\uD834\uDD60") 不同于音乐符号十六分音符???? ("\uD834\uDD61").

标签: java unicode int ascii


【解决方案1】:

来自docs

char:char 数据类型是单个 16 位 Unicode 字符。它的最小值为“\u0000”(或 0),最大值为“\uffff”(或 65,535,包括在内)。

要使您的解决方案也适用于 Unicode 字符,请更改以下行:

if (str.length() > 256) return false;
boolean[] char_set = new boolean[256];

改为:

if (str.length() > Character.MAX_VALUE + 1) return false;
boolean[] char_set = new boolean[Character.MAX_VALUE + 1];

  1. int val=str.charAt(i) 我搜索了 ASCII 表。如果字符串是“@ABCD”,会返回什么数字? (将使用“Dec、Hx、Oct”这三个中的哪一个?)

您可以运行代码并亲自查看。 "@ABCD".charAt(0) 返回 @ 类型的 char。 根据 ASCII 表转换为 int 即 64。

Dec、Hx、Oct 都只是同一事物的翻译。 就像西班牙语中的“书”将是“libro”一样, 十六进制的 63 将是 0x3f

  1. str.charAt(i) 应该返回一个字符(例如 A),为什么将数据类型声明为 int 可以直接将字符转换为相应的 ASCII 表的数字?

我猜这就是char 在语言本身中的定义方式, 但我找不到权威参考。

【讨论】:

    【解决方案2】:

    str.charAt(i)应该返回一个字符(例如A),为什么将数据类型声明为int可以直接将字符转换为相应的ASCII表的数字?

    当您编写int i = str.charAt(...) 时,Java 语言规范将其称为Widening Primitive Conversion。您可以这样做,因为intchar 都是类似整数的数字类型,并且每个合法的 char 值也是合法的 int 值。

    http://docs.oracle.com/javase/specs/jls/se5.0/html/conversions.html#25214

    至于为什么是ASCII?这是因为 Unicode 是为与 US-ASCII 字符集兼容而特意设计的。对于 ASCII 中的每个字符,它的 Unicode 编码具有与其 ASCII 编码相同的数值。


    将使用“Dec、Hx、Oct”这三个中的哪一个?

    Dec、Hx 和 Oct 列中的数字只是用不同的位值基数表示的相同数字。以字母“A”为例。当你用十进制表示“A”的数字代码时,它是“65”。以 16 为基数表示的相同数字是“41”,以 8 为基数表示的是“101”。该表给出了所有三个库中的代码,因为这三个库都常用于计算机程序以及计算机硬件和软件的文档中。

    Base 8 和 base 16 是常用的,因为所有现代计算机都表示以 2 为底的数字,并且在 base 2 和 base 8 或 base 16 之间转换非常容易。

    http://en.wikipedia.org/wiki/Hexadecimal

    http://en.wikipedia.org/wiki/Octal

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-12
      • 2013-06-25
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      • 2015-04-30
      相关资源
      最近更新 更多