天天看點

JAVA如何對字元串去重問題描述問題分析代碼實作測試結果

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
           

繼續閱讀