面试:字符串中的相关试题

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

首先,你能够问面试官,构成字符串的字符集有多大?是ASCII字符,仍是只是26个字母? 仍是有更大的字符集,对于不一样的状况,咱们可能会有不一样的解决方案。面试

若是咱们假设字符集是ASCII字符,那么咱们能够开一个大小为256的bool数组来表征每一个字 符的出现。数组初始化为false,遍历一遍字符串中的字符,当bool数组对应位置的值为真, 代表该字符在以前已经出现过,便可得出该字符串中有重复字符。不然将该位置的bool数组 值置为true。代码以下:算法

//若是字符集只是a-z(或是A-Z),那就更好办了,用位运算只须要一个整型数便可。
    public static boolean stringDiff(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;
            checker |= (1 << val);
        }
        return true;
    }
    
    //bool数组实现
    public static boolean stringDiff2(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;
    }
    
    //int数组,位表示
    public static boolean stringDiff(String string) {
        int[] a = new int[8];
        int len = string.length();
        for(int i=0; i < len; ++i) {
            int v = (int)string.charAt(i);
            int idx = v / 32;
            int shift = v % 32;
            if((a[idx] & (1 << shift)) > 0) return false;
            a[idx] |= (1 << shift);
        }
        return true;
    }

题目2.:一个字符串中,求出现次数最多的那个字母及次数,若是有多个重复的则都求出。数组

  • 引入TreeSet:经过集合快速找到全部出现的字符串
  • 引入ArrayList:为了快速排序,再经过StringBuilder生成排序后的字符串
  • 经过String API中的基本方法indexOf,lastIndexOf来计算TreeSet中每一个字符串的最大值
public static void doString(String input) {
        char[] charArr = input.toCharArray();
        List list = new ArrayList();
        TreeSet set = new TreeSet();
        for(int i = 0; i < charArr.length; i++) {
            list.add(charArr[i]);
            set.add(charArr[i]);
        }
        System.out.println(set);
        Collections.sort(list);
        System.out.println(list);

        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < list.size(); i++) {
            sb.append(list.get(i));
        }
        input = sb.toString();
        System.out.println(input);

        int maxNum = 0;
        String maxString = "";
        List maxList = new ArrayList();
        Iterator iterator = set.iterator();
        while(iterator.hasNext()) {
            String str = iterator.next().toString();
            int startIndex = input.indexOf(str);
            int lastIndex = input.lastIndexOf(str);
            int tempMax = lastIndex - startIndex + 1;
            if(tempMax > maxNum) {
                maxNum = tempMax;
                maxString = str;
                maxList.add(str);
            } else if(tempMax == maxNum) {
                maxList.add(str);
            }
        }

        int index = 0;
        for(int i = 0; i < maxList.size(); i++) {
            if(maxList.get(i).equals(maxString)) {
                index = i;
                break;
            }
        }

        System.out.println("max data: ");

        for(int i = index; i < maxList.size(); i++) {
            System.out.print(maxList.get(i) + " ");
        }

        System.out.println();
        System.out.println("max: " + maxNum);
    }
相关文章
相关标签/搜索