搬运工

导航

1.判断字符串中的字符是否Unique

    最近开始研究《Cracking the Coding Interview》一书,其实就是美版的IT面试宝典。但是细细品读下来,感觉其质量要优于国内的许多同类书籍。言简意赅,不拖泥带水,作者希望引导读者如果循序渐进思考、提高个人技能。
  有感于自己之前实习面试的挫折经历,发现对很多知识点理解都很浅,借此机会夯实下基础,以便迎接之后找工作大业......
Question1. Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structure?

本题应该是非常简单的,关键能否想到巧借字符的ASCII值解题。话说代码是程序员最好的沟通语言,因此直接上Code:
View Code
int isUniqueCh1(char * str)
{
    int i,j;

    int n = strlen(str);   /* 输入字符串的长度 */
    int value;

    for(i = 0; i< n-1; i++)
    {
        for(j = n-1; j > i; j--)
        {
            value = *(str+i) - *(str+j);  /* 两个字符ASCII码相减为0判断相等 */
            if( value == 0 )
            {
                return 0;    /* Not Unique */
            }

        }
    }
    return 1;  /* Unique */

这是我自己想到的方法,利用两层循环,两个指针遍历判断字符ASCII值差是否为0。但是看了作者答案之后,发现更妙:

View Code
int isUniqueCh2(char* str)
{
    int n = strlen(str);
    int i;
    int value;         /* 保存相应字符的ASCII码值 */
    int checker = 0;
    for( i = 0; i < n; i++)
    {
        value = *(str+i) - 'a';

        if((checker & (1 << value)) > 0)
        {
            return 0;  /* Not Unique */
        }
        checker |= 1 << value;
    }

    return 1;  /* Unique */

}

作者答案利用了位运算。但是最精妙的在与将字符串与一串二进制数对应起来。思想就自己看代码理解了,相信很容易看懂的:)。注:作者都是用Java写的,我改用C实现了,其实大同小异。

  这边废话几句,作者在本书开头提到希望能使用Java或者C#等OO语言写代码,因为其比较直观,这样有C++背景的面试官也容易理解,但这就见仁见智了,能来面试别人的哪个没几把刷子。而这些人一般都精通几门语言,所以感觉自己哪种语言用的熟,更能实现自己意图就用哪个吧,面试官考察的是解题思路,只要能将思路、算法表述清楚就OK了。

作者实现代码:

View Code
public static boolean isUniqueChars2(String str) {
        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;
    }

以上为个人看后的见解,有不足之处欢迎拍砖,如有更好方法的也欢迎讨论共勉!

posted on 2012-07-07 12:16  hackergodness  阅读(478)  评论(0编辑  收藏  举报