如果我需要检查字符串是否有唯一字符,我理解如果我们正在考虑Ascii表中的字符,那么它们将有128个字符。
但是,为什么我们需要创建一个大小为256的布尔数组来保存128个字符以检查元素在字符串中是否至少存在一次?大小128的布尔数组不应该足够吗?
以下是“Cracking the Coding Interview”一书的引用:
if (str.length() > 128) return false;
boolean[] char_set = new boolean[256]; //which is strange since it clearly says over 128 its false
.....
答案 0 :(得分:18)
基本上,我们只使用128个字符,这个字符主要在程序中使用。 但ASCII表中的字符总数为256(0到255)。 0到31(总共32个字符)被称为ASCII控制字符(字符代码0-31)。 32到127个字符称为ASCII可打印字符(字符代码32-127)。 128到255被称为扩展ASCII码(字符代码128-255)。
检查参考:http://www.ascii-code.com/
大多数扩展的ASCII字符都不存在于QWERTY(英语)键盘中,所以这就是原因,作者在该示例中总共获得了128个字符" Cracking the coding interview"书。
答案 1 :(得分:14)
不,有256个ASCII字符。这包括标准ASCII字符(0-127)和扩展ASCII字符(128-255)。
了解更多信息。请参阅: http://www.flexcomm.com/library/ASCII256.htm
答案 2 :(得分:7)
现在很多人使用的术语是" ASCII"以简洁的方式描述ISO-8859-1 (also known as Latin-1),一个字符集,包括旧时ASCII字符集中的[32 .. 126]可打印字符值以及[128..255]范围内的值。 Latin-1在覆盖西欧语言方面做得相当不错,而ASCII仅限于基础英语中使用的非重音字符。
ASCII还包括[0-31]和127范围内的控制字符。这些字符不代表可打印字符(尽管unicode在这些位置提供字符)。它们是返回,换行,制表符,ctrl-c,换页等。其中一些是电传和电传机器的旧时代的延续。
注意纸带如何在每帧中有8个位位置。这些是ASCII / Latin-1的位。 "删除" aka Rubout是127或0111 1111.为什么?因为可以打出磁带上的所有七个孔,所以擦掉一个角色。
这可能解释了某人使用256位数组来制表那种字符集中的文本的建议。
答案 3 :(得分:1)
我认为在同一本书中,在同一函数中使用128和256是错误的。在较新的第六版(2016)中,代码示例指出:
if (str.length() > 128) return false;
boolean[] char_set = new boolean[128];
作者添加评论:
可以假定256个字符。扩展ASCII就是这种情况。
因此,对于该书练习,使用 或或 256而不是两者都使用。
答案 4 :(得分:1)
作者可能混淆了字符和字节。您还应该了解编码的相关概念。
一个字节是八位。传统上通常使用字节来存储字符,尽管很早的计算机仅需要7位来存储字符。 {7}编码7位字符的ASCII standard于1963年获得批准,尽管当时还存在一些竞争性的字符编码(其中EBCDIC至今仍然有效)。
当您仅使用可用的8位中的7位时,您可能会想到如何处理备用位。常见方法之一是对ASCII标准中不可用的其他非标准字符进行编码。已经定义了许多传统的8位编码,其中一些也已作为标准发布。直到今天,有些仍然很受欢迎。 ISO-8859-1(又名Latin-1)和Windows代码页(437,850和1252等示例在西方国家仍然很普遍,缺点)。其中许多是“扩展的ASCII”编码,与前128个字节的ASCII兼容;尽管术语“扩展ASCII”在技术上并没有真正定义好。
如果要处理一个字节序列,您确实希望能够处理0-255范围内的字节值,而不仅仅是ASCII中定义的字节值。另一方面,如果您保证要处理的字节中的任何一个都不会具有大于127的值(例如,例如,如果您的输入已知为ASCII,因为它来自无法产生的源),为您知道不需要的值留出空间是多余的。
展望未来,大多数现代系统都会以一种或另一种形式使用Unicode。在Windows上(显然仍在Java中),您应该期望UTF-16;在其他地方,UTF-8正在迅速成为事实标准。这两种方法都要求您的代码能够干净地处理8位字节,尽管这些代码点(不必(在UTF-8中,或者曾经在UTF-16中)没有)编码为单个字节。
对于您发布的代码,如果您丢弃任何值大于127的字节,那么128个字符的位置就足够了。另一方面,根据您希望处理的数据,丢弃非ASCII字符可能根本不是正确的选择;然后,如果您不丢弃任何东西,则确实需要处理所有256个。
无论哪种方式,如果仅丢弃大于128的值,则数组中需要129个位置(0到128范围内有129个整数)。这可能只是一个愚蠢的一次性错误。