1. 程式人生 > >[面經]阿里遊戲一面的演算法題

[面經]阿里遊戲一面的演算法題

前言:兩天前參加阿里遊戲的面試,一面時出了一道面試題。那時我看楞了,好像沒做過這種題型,看起來很容易又很難。很容易是,使用O(N^2)就可以解決,難得是,優化時間複雜度。

題目:字串刪除字元(字元可能會有重複,要一起刪掉)

思路一(反正面試我沒這麼寫,你們隨便看看)

一開始看到題目,思路就遍歷字串,一個個字元比較,然後刪除它。
(1) 遍歷陣列,找到目標字元;
(2) 移動目標字元後面的所有字元,各向前移動複製1位;
(3) 刪除最後一位字元(或標識它不可用);
(4) 重複(1)直至迴圈結束。

優點(當然有):容易想出來,程式碼邏輯簡單;


缺點:時間複雜度O(N^2)。

    public static String deleteChar(String str, char c)
    {
        if (str == null || "".equals(str)) return str;
        int len = str.length();
        char[] ca = str.toCharArray();
        for (int i = 0; i < len; i++)
        {
            while (len != 0 && ca[i] == c)
            {
                len--;
                if
(len!= i){ for (int j = i; j < len; j++) { ca[j] = ca[j + 1]; } } else{ break; } } } if (len == str.length()) return str; // java被迫無奈~
return new String(ca,0, len); }

思路二(逗比的我的現場解法)

有沒有辦法一次性將所有字元集合在一起,然後一起刪除掉呢?有沒有很熟悉呢?快速排序?沒錯就是它!我們在實現快速排序時用到的關鍵方法partition的思路!裡面比較大和小,我們這裡換成比較相等於不想等就Ok啦!對不對!?

優點:時間複雜度:O(N);
缺點:字串亂序。

這裡的程式碼我就不寫出來了,需要的話,參考快速排序程式碼。

思路三(機智的我開竅改回來了)

增強版的partition。同樣的思路來自於快速排序演算法,經典的快速排序演算法對付很多重複數的陣列效率低,有人發明了改進這一效率的partition。思路是使用三個指標,第一個指標相當於經典快排的第一個指標,後面兩個指標相當於經典快排的最後一個指標,只是兩個指標間的數都是相等重複的數。

步驟

優點:克服和思路二的缺點,又具有思路二的優點。

    public static String deleteChar(String str, char c)
    {
        if (str == null || "".equals(str)) return str;
        int i = 0;
        int j = 0;
        int len = str.length();
        for (; i < len && str.charAt(i) != c; i++);

        if (i == len) return str;
        // 下面是重點
        char[] ca = str.toCharArray();
        j = i;
        while (j < len)
        {
            while (j < len && ca[j] == c)
            {
                j++;
            }
            if (j >= len) break;
            // 交換
            exch(ca, i++, j);
        }
        // java被迫無奈~
        return new String(ca,0,i);
    }