溶液:
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;
}
我有一些问题:
代码基于给定字符串是ASCII字符串的前提,如果它是Unicode字符串,该怎么办? ASCII字符串和Unicode字符串有什么区别?
int val = str.charAt(i) 我搜索了ASCII表
如果字符串是“@ABCD”,将返回什么号码?(将使用三个“Dec,Hx,Oct”中的哪一个?)
答案 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];
- int val = str.charAt(i)我搜索了ASCII表。如果字符串是&#34; @ ABCD&#34;,将返回什么号码? (将使用三个&#34; Dec,Hx,Oct和#34中的哪一个?)
醇>
您可以运行代码并亲自查看。
"@ABCD".charAt(0)
返回@
类型的char
。
根据ASCII表格转换为int
的64位。
Dec,Hx,Oct都是同一件事的翻译。
就像&#34; book&#34;西班牙语将是&#34; libro&#34;,
以十六进制表示的63将为0x3f
。
- str.charAt(i)应该返回一个字符(例如A),为什么将数据类型声明为int可以直接将字符转换为相应的ASCII表的数字?
醇>
我想这就是语言本身定义char
的方式,
但我无法找到权威的参考资料。
答案 1 :(得分:0)
str.charAt(i)应该返回一个字符(例如A),为什么将数据类型声明为int可以直接将字符转换为相应的ASCII表的数字?
当您编写int i = str.charAt(...)
时,Java语言规范会调用扩展原始转换。您可以这样做,因为int
和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”。该表给出了所有三个基础的代码,因为这三个代码通常用于计算机程序,以及计算机硬件和软件的文档中。
基本8和基数16是常用的,因为所有现代计算机都代表基数2中的数字,并且在基数2和基数8或基数16之间转换非常容易。