在一段英文字母中找出,每一個字母重複數量的方法,這是我遇到過的一道面試題。方法有不少種,這裏給你們介紹一種比較高效的處理方法。java
假設一段英文字母以下:web
afggsgshdhdddh dh dhd hdggggRRGRG面試
優化:含有字母空格數字等特殊字符的狀況:優化
afggsgshdh,%&8(dddh dh dhd hdggggRRGRGspa
2015/8/15code
你須要把這裏麪包含的字母的數量統計出來。orm
曾經我去面試就遇到過這個問題。我一開始想到的是字符串截取,用一個循環嗎,每次截取一個字符,而後用一個循環與26個英文字母比較,從a-z,而後計算出這26個字母在這段文字中出現的次數,這是一種很笨的方法,面試官當場叫能不能用另一種方法,低效沒有技術含量的了,當時感受本身真的OUT了。回去以後,我想了很久,終於想出一個用hashmap,哈希圖統計的方法,給你們分享下。接口
首先給你們介紹下 java 的hashmap數據類型,hashmap是基於哈希表的 Map 接口的實現。hashmap有兩個元素一個是key(鍵名),一個是value(鍵值),就至關於一個字典了,這跟Python裏的字典是同樣的。下面給你們說下實現的原理:我將這段文字中出現的字母,做爲鍵值(key),出現的次數 做爲鍵值(value),hashmap中的鍵名是不能重複的,那麼統計這些字母數量,就變成了統計這些相同鍵名得數量。個人實現方式是從第一個字母開始,把字母存到哈希表去,第一個就是a:1,而後按順序存第二個字母f:1,若是出現跟前面有的字母重複的話,前面的字母鍵值就+1,例如aba,遍歷到第3個字母的時候,a的鍵值就變成2,就是a:2了,若是遇到空格數字,標點符號,及其餘特殊字符就排除掉,不插入,若是標點符號也統計則不須要判斷此條件,所有都插入便可。以此類推其餘字母也是同樣的。下面給你們上代碼:ci
package org.webdriver.autotest.Study; import java.util.HashMap; public class hashmap_examp1 { public static void main(String[] args) { // TODO 自動生成的方法存根 HashMap<String,Integer> map=new HashMap<String,Integer>(); //英文段落含有字母數字標點符號空格和其餘特殊字符2015/8/15優化 String str="ashsglsjgj jj jg,^%566*yy 證書號 gsjljghffghfjfjhgguukuykykuthhhfhjffjfjfdsfgfsgshsdhgh"; for(int i=0;i<str.length();i++) { char c=str.charAt(i); String key=String.valueOf(c); if(map.containsKey(key)) { //Integer value=map.get(key).intValue(); Integer value=map.get(key); map.put(key, value+1); } else { // map.put(key, 1);能夠統計全部字符,包括中文 //利用ascii碼去除字符串中的數字,空格,標點符號,特殊字符。限定只統計標點符號2015/8/15優化 if(c>='A'&&c<='Z'||c>='a'&&c<='z') { map.put(key, 1); } } } System.out.println(map); } }
運行結果以下:字符串
{a=1, s=8, t=1, d=2, u=4, f=11, g=11, h=11, y=4, j=12, k=3, l=2}