问题:实现算法以确定字符串是否具有所有唯一字符。如果您不能使用其他数据结构,该怎么办?

时间:2014-10-12 15:21:13

标签: java unicode int ascii

溶液:

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表ASCII table

  3. 如果字符串是“@ABCD”,将返回什么号码?(将使用三个“Dec,Hx,Oct”中的哪一个?)

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

2 个答案:

答案 0 :(得分:0)

来自docs

  

char:char数据类型是一个16位Unicode字符。它的最小值为&#39; \ u0000&#39; (或0)和&#39; \ uffff&#39;的最大值(或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表。如果字符串是&#34; @ ABCD&#34;,将返回什么号码? (将使用三个&#34; Dec,Hx,Oct和#34中的哪一个?)
  2.   

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

Dec,Hx,Oct都是同一件事的翻译。 就像&#34; book&#34;西班牙语将是&#34; libro&#34;, 以十六进制表示的63将为0x3f

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

我想这就是语言本身定义char的方式, 但我无法找到权威的参考资料。

答案 1 :(得分:0)

  

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

当您编写int i = str.charAt(...)时,Java语言规范会调用扩展原始转换。您可以这样做,因为intchar都是类似整数的数字类型,并且每个合法字符值也是合法的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”。该表给出了所有三个基础的代码,因为这三个代码通常用于计算机程序,以及计算机硬件和软件的文档中。

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

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

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