消掉連續3個相同的字符

題目

// 我有一個字符串,字符串sxsddfsdfdddlll
// 消掉連續3個相同的字符,結果要看不到任意連續3個字符 20分鐘

當時的心理分析

這是一道實際的面試題目,我看到這題時,知道鐵定涼了。
首先,時間複雜度方面,從頭到尾掃一遍是必然的,O(n)是這個題目的極限了,要是說得不對,歡迎指正。
那麼這個題目想考察什麼呢,無非就是編碼規範,編碼速度方面的內容。
所以我大概花了8~10分鐘的時間迅速完成了這到題,雖然寫下了比較糟糕的代碼,但主體思路是沒什麼問題的。
期間面試官似乎在睡覺,提醒面試官的時候,面試官還以爲時間差不多了。

讓我覺得涼的原因:

  1. 這題不是一道講究難度的題目,誰都有機會做出來,給一個畢業生去做比較合適。或許我不太瞭解行情,但以我剛畢業時的水平,這個題目要寫出來也是沒問題的。對於一個有經驗的人來說,做出來後,人家會覺得一個剛畢業的小夥也能做,爲什麼要招你呢。
  2. 這不是一個普通職位,這道題就算做出來了,也毫無感覺,沒有任何加分。人家必然揪着你以往的項目來進行。擺這題的目的只有一個,你項目經歷比較一般,而且你看你這麼簡單的題目都做不好,知難而退吧。

理解上的誤區

暫時沒有發現對題目的解讀存在什麼誤區。

代碼

class A {
    public String handle(String s) {

        if (s == null || s.length() == 0) {
            return "";
        }
        StringBuilder sb = new StringBuilder();

        // 當前的相同數目
        int a = 1;
        // 當前的字符
        char c = s.charAt(0);

        for (int i = 1; i < s.length(); i++) {
            if (s.charAt(i) == c) {
                a++;
                if (a == 3) {
                    // 這個字符要消掉的
                    // 直接讀下一個
                    if (i + 1 < s.length()) {
                        a = 1;
                        c = s.charAt(i + 1);
                        i++;
                    } else {
                        break;
                    }
                }
            } else {
                // 把c存一下
                while (a > 0) {
                    sb.append(c);
                    a--;
                }
                //保存一下本次的。
                a = 1;
                c = s.charAt(i);
            }
        }
        return sb.toString();

    }


    public static void main(String[] args) {
        //
        String s = "sxsddfsdfdddlll";
        String ss = new A().handle(s);
        System.out.println(ss);
    }
}

這段代碼是有問題的
在退出for循環後,沒有把遺留的a和c放到結果集裏面去。

擴展思考

這道題其實可以有些變形,例如 消掉連續5個相同的字符,假如是這樣的題目,是有比O(n)更快一點的思路的。
輸入假設爲:abcdddddaccccccb
在這裏插入圖片描述

在這種前提條件下,題目纔會變得更加有搞頭。可是連續3字符無法產生高效解法。可能存在其他套路解法,例如滑窗解法,或者代碼很簡潔的解法。但那都很難讓人提起興趣去研究。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章