[面經]阿里遊戲一面的演算法題
阿新 • • 發佈:2019-01-04
前言:兩天前參加阿里遊戲的面試,一面時出了一道面試題。那時我看楞了,好像沒做過這種題型,看起來很容易又很難。很容易是,使用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);
}