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


    题目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);
        }
    
    
  • 相关阅读:
    Spark概述及集群部署
    Scala编程实战
    Scala的高级特性
    Scala基础
    MapReduce优化参数
    HDFS安全模式
    HDFS元数据管理机制
    Hadoop Federation联邦
    Hadoop HA集群的搭建
    Hadoop High Availability高可用
  • 原文地址:https://www.cnblogs.com/csyuan/p/6625437.html
Copyright © 2020-2023  润新知