1. 程式人生 > >找到字串中第一個不重複的元素

找到字串中第一個不重複的元素

題目:在一個字串中找到第一個沒有重複元素的字元並返回。

例:輸入:"yellow"   

  返回:“y”

  輸入:"tooth"

  返回:“h”

  輸入:“coco”

  返回:“”

按照人類思維來判斷的話,比較該元素與後面的元素,如果相同,再比較下一個元素。如果都不相同,是在內迴圈之後判斷的

虛擬碼:

for(。。。。){

for(........)

{

if(相同)

break;

   }

if(標誌牌沒變)//說明都不相同

return。。。;

}

這個題目我在亞馬遜電話面試中遇見過,後來再一家日本公司面試中也遇見過。儘管這個問題並沒有涉及到比較高階的程式設計思想,比如動態程式設計dynamic Programming或者Divide and Conquer,但是如果對資料結構或者演算法並不很熟練的人來說,還是會構成一定的困難。

好了,那麼現在就來分析一下這個問題。

首先,最直觀的解法就是利用迴圈挨個兒從第一個元素起往後面找有沒有重複,如果遍歷完成後還沒有,那麼這個元素就是第一個沒有重複的元素,直接在迴圈體中返回值就可以了。那麼具體解法就需要兩個迴圈控制,第一個用來定位要檢視的元素,第二個迴圈用來在字串中找有沒有跟他重複的元素。這個演算法的時間複雜度是O(n2), 因為假設這個字串中元素都有重複,那麼第一個迴圈需要遍歷n次,第二個迴圈也需要遍歷n次。空間複雜度是O(c),為常數,因為我們並沒有新增新的資料結構。Java程式碼如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public static String findCharInPlace(String s){ int len = s.length(); if(len <= 0return null; boolean repeated = false; for(int i=0;i<s.length();i++){ repeated = false; int j=0; for(;j<s.length();j++){ if(j!=i&&s.charAt(j)==s.charAt(i)){ repeated = true; break; }
} if(!repeated) return s.charAt(i)+""; } return  ""; }