cci-Q1.1 判断字符串中字符是否唯一

来源:互联网 发布:motion graphic软件 编辑:程序博客网 时间:2024/05/30 20:07
原文:

Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structures?

译文:

实现一个算法来判断一个字符串中的字符是否唯一(即没有重复).不能使用额外的数据结构。 (即只使用基本的数据结构)

1,假设题目中的字符指得的是ascii码

ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。其中: 0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。 32~126(共95个)是字符(32sp是空格),其中48~57为0到9十个阿拉伯数字 65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。 同时还要注意,在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。 后128个称为扩展ASCII码,目前许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。

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

testcase

    public void testIsUniqueChars() {        System.out.println("isUniqueChars");        q1_1 instance = new q1_1();              assertEquals(true, instance.isUniqueChars("123"));        assertEquals(false, instance.isUniqueChars("122"));        assertEquals(true, instance.isUniqueChars(""));        assertEquals(true, instance.isUniqueChars("1234567890qwertyuiop[]asdfghjkl;'zxcvbnm,./"));        assertEquals(false, instance.isUniqueChars("1234567890qwertyuiop[]asdfghjkl;'zxcvbnm,./1"));        assertEquals(false, instance.isUniqueChars("\"\""));    }

如果只含有a-z可以使用bit vector来节省空间

    public boolean isUniqueChars2(String str) {        int checker = 0;        for (int i = 0; i < str.length(); i++) {            int val = str.charAt(i) - 'a';            if ((checker & (1 << val)) > 0) {                return false;            } else {                checker |= (1 << val);            }        }        return true;    }