面試:字符串中的相關試題

題目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);
    }
相關文章
相關標籤/搜索