首页 > 学院 > 开发设计 > 正文

一道关于字符操作的面试题

2019-11-15 01:11:18
字体:
来源:转载
供稿:网友
一道关于字符操作的面试题

假设现在有一个很长的字符串(只包括英文字母),现在需要统计长字符串中每个字母字符出现的次数。

暂时想出以下两种方法:

package com.sphere.letters;import java.util.ArrayList;import java.util.HashMap;import java.util.List;/** * 统计长字符串中每个字母字符出现的次数(区分大小写) * 并以 <字符,出现次数> 的键值对形式返回 */public class Test {    PRivate static String TEST = "AWQEYIOAHDHDKKLDLAHFHJALAFHANNAFGJCXCKBZCQIEO" +            "PADHAZBZVCFGCSHDJCKCLDMDHFAKAIIAYQO";    public static void main(String[] args) {        getMapByArray(TEST);    }        private static HashMap<Character, Integer> getMapByArray(String str){        char[] array = str.toCharArray();        List<Character> list = new ArrayList<Character>();        HashMap<Character, Integer> map = new HashMap<Character, Integer>();        for (int i = 0; i < array.length; i++) {            list.add(array[i]);        }        //循环对比 假定没有一个重复的元素 则循环基数为size()        int length = list.size();                while(length > 0){            //某个字符出现的次数  list首个元素不再比较之列            int count = 1;            for (int i = 1; i < length; i++) {                //每次拿list的第一个字符 与之后的所有字符对比                if(0 == list.get(0).compareTo(list.get(i))){                    //存在相同的就从list中移除                    //并且长度减1,出现次数加1,                    //i减1,下次还从此索引检测,以防连续字母出现时跳过的情况                    list.remove(i);                    length--;                    count++;                    i--;                }            }            //移除第一个字符            map.put(list.get(0), count);            list.remove(0);            length--;            /**************FOR TEST*******************            for (Character ch : list) {                System.out.print(ch);            }            System.out.println();            System.out.println("元素个数:"+list.size());            **************FOR TEST*******************/                    }        System.out.println(map);                return map;    }}

也可以利用26个英文字母的特殊性得到字母出现的次数

我们可以建立一个int[] array = new int[26] 的数组,

英文字母具有特殊性 字母对应ASCII编码中的某个值

以字母A或者a为基数 将每个字符和A或者a相减,并将对应位置的值加1

    private static int[] array = new int[26];    //英文字母具有特殊性 字母对应ASCII编码中的某个值    //以字母A或者a为基数  将每个字符和A或者a相减    private static void getCharCountsByASCII(String str){        char temp ;        for (int i = 0; i < str.length(); i++) {            temp = str.charAt(i);            if(temp >= 'A' && temp <='Z'){                array[temp - 'A']++;            }else if(temp >= 'a' && temp <='z') {                array[temp - 'a']++;            }else {                            }        }                /**************FOR TEST*******************/        for (int i = 0; i < array.length; i++) {            System.out.print(array[i]+" ");        }        /**************FOR TEST*******************/    }

感觉这两种方法效率都不是很高,哪位有更好的办法还请留言告知一下,谢谢。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表