• 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;
        }

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

    数据库不平,何以平天下,啊啊啊~
  • 相关阅读:
    费用流
    平面最近点对
    纸牌均分问题
    cdq分治模板
    费解的开关
    斐波那契和排列组合性质
    主席树
    Springboot使用EasyExcel(仅限自己收藏)
    vue项目中h5移动端中通过flex布局实现首尾固定,中间滚动(借鉴)
    vue路由参数的获取、添加和替换
  • 原文地址:https://www.cnblogs.com/hackergodness/p/2580539.html
Copyright © 2020-2023  润新知