星空网 > 软件开发 > Java

[迅雷] 一道关于字符操作的面试题

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

 

暂时想出以下两种方法:

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

 

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




原标题:[迅雷] 一道关于字符操作的面试题

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

出口巴林注意事项:https://www.kjdsnews.com/a/1482666.html
寻汇SUNRATE获新加坡CMS牌照:https://www.kjdsnews.com/a/1482667.html
单店月销80万单,TEMU爆款产品大曝光!:https://www.kjdsnews.com/a/1482668.html
直播间搭建及设备详解:https://www.kjdsnews.com/a/1482669.html
解锁2023年跨境支付策略!实时向银行卡付款如何促进跨境支付?:https://www.kjdsnews.com/a/1482670.html
网站谷歌seo推广和youtube视频的效果对比:https://www.kjdsnews.com/a/1482671.html
23点聊电商:新质生产力加速数字贸易发展 卓尔智联集团实现营收利润双增长 :https://www.kjdsnews.com/a/1836411.html
南京浦口都有什么好玩的地方 南京浦口都有什么好玩的地方推荐:https://www.vstour.cn/a/363180.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流