爱程序网

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

来源: 阅读:

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

 

暂时想出以下两种方法:

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*******************/ }

 

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

关于爱程序网 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助