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

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

首先,你可以问面试官,构成字符串的字符集有多大?是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);
    }

原文地址:https://www.cnblogs.com/csyuan/p/6625437.html