JAVA如何對字元串去重
- 問題描述
- 問題分析
-
- 思路1:周遊每個字元删除重複字元
- 思路2 :先記錄字元首次出現位置後求目标字元串
- 代碼實作
- 測試結果
-
- 測試代碼
- 測試結果
問題描述
工作中遇到這麼一個問題,在一個字元串中需要去重,無論大小寫隻保留最先出現的字元。如:AbaBcd去重後為Abcd。
問題分析
思路1:周遊每個字元删除重複字元
這個問題你可以說最笨的方法那就是周遊字元串中的每個字元,跟後面的對比,如果重複那就删除改字元。這樣的話是沒問題,但是成本是高的。
思路2 :先記錄字元首次出現位置後求目标字元串
這裡我想到了一個思路,可以隻周遊一次字元串就可以做到,如我可以周遊一次字元串,然後隻儲存首次出現的字母的位置,這樣再通過這個位置資訊來生成一個所需要的字元串,那就是要求的字元串了要,如何記錄字元串首次出現位置?首先要儲存字元和首次出現的位置,這樣的資訊很明顯,我們需要Key-Value對(鍵-值對),是以需要使用到Map這樣的資料結構,而要隻儲存首次出現,那又是涉及到不重複的問題,比如字元‘A’已經出現過了,位置是1,在map裡面有了,當我們再次掃到‘A’時就不能再放到map裡了,恰好java中的Map有這個特性。
代碼實作
/**
* 記2021.04.08面試題目:
* 假如有有一個字元串,其中可能存在重複的字母(無論大小寫)
* 要進行去重複(無論大小寫,大小寫視為同一個字母).
* 第一步:
* 先把字元串str轉大寫和轉為字元數組,然後使用一
* 個LinkedHashMap來記錄首次出現的字母和所在字元數組位
* 置的下标
* 第二步:
* 根據LinkedHashMap存放的有序的key對應的value
* (即改字母首次出現的位置)對應str轉成字元數組後的數組選
* 擇出全部字母
* @param str
* @return
*/
public static String deleteSame(String str){
String s = str.toUpperCase();//轉大寫
char[] chars = s.toCharArray();//字元串轉數組
LinkedHashMap<Character, Integer> map = new LinkedHashMap<>();
//使用LinkedHashMap是為了key-value在put到map時是有序的,後面使用的時候就是有序的
for (int i = 0;i<chars.length;++i) {
if (!map.keySet().contains(chars[i])){
map.put(chars[i],i);
}
}
StringBuffer sb = new StringBuffer();
char[] chars1 = str.toCharArray();
for (Character character : map.keySet()) {//通過map儲存的資訊将chars1裡面逐個首次出現字元加到StringBuffer裡
sb.append(chars1[map.get(character)]);
}
return sb.toString();
}
測試結果
測試代碼
測試結果
aVbdsfeXC