谷歌面試題
實現一個演算法來判斷一個字串中的字元是否唯一(即沒有重複).不能使用額外的資料結構。 (即只使用基本的資料結構)
解答
首先,你可以問面試官,構成字串的字符集有多大?是ASCII字元,還是隻是26個字母? 還是有更大的字符集,對於不同的情況,我們可能會有不同的解決方案。
如果我們假設字符集是ASCII字元,那麼我們可以開一個大小為256的bool陣列來表徵每個字 符的出現。陣列初始化為false,遍歷一遍字串中的字元,當bool陣列對應位置的值為真, 表明該字元在之前已經出現過,即可得出該字串中有重複字元。否則將該位置的bool陣列 值置為true。程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | boolisUnique1(strings) { boola[256]; memset(a,0,sizeof(a)); intlen=th(); for(inti=0;i<len;++i) { intv=(int)s[i]; if(a[v])returnfalse; a[v]=true; } returntrue; } |
該演算法的時間複雜度為O(n)。我們還可以通過位運算來減少空間的使用量。 用每一位表徵相應位置字元的出現。對於ASCII字元,我們需要256位,即一個長度為8的 陣列a即可。這裡的關鍵是要把字元對應的數字,對映到正確的位上去。比如字元’b’對應的 程式碼是98,那麼我們應該將陣列中的哪一位置為1呢?用98除以32,得到對應陣列a的下標: 3。98對32取模得到相應的位:2。相應程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | boolisUnique2(strings) { inta[8]; memset(a,0,sizeof(a)); intlen=th(); for(inti=0;i<len;++i) { intv=(int)s[i]; intidx=v/32,shift=v%32; if(a[idx]&(1<<shift))returnfalse; a[idx]|=(1<<shift); } returntrue; } |
兩個演算法的本質其實是一樣的,只不過一個用bool單元來表徵字元出現,一個用位來表徵。 完整程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include <iostream> #include <cstring> usingnamespacestd; boolisUnique1(strings) { boola[256]; memset(a,0,sizeof(a)); intlen=th(); for(inti=0;i<len;++i) { intv=(int)s[i]; if(a[v])returnfalse; a[v]=true; } returntrue; } boolisUnique2(strings) { inta[8]; memset(a,0,sizeof(a)); intlen=th(); for(inti=0;i<len;++i) { intv=(int)s[i]; intidx=v/32,shift=v%32; if(a[idx]&(1<<shift))returnfalse; a[idx]|=(1<<shift); } returntrue; } intmain() { strings1="i am hawstein."; strings2="abcdefghijklmnopqrstuvwxyzABCD1234567890"; cout<<isUnique1(s1)<<" "<<isUnique1(s2)<<endl; cout<<isUnique2(s1)<<" "<<isUnique2(s2)<<endl; return0; } |
如果字符集只是a-z(或是A-Z),那就更好辦了,用位運算只需要一個整型數即可。
1 2 3 4 5 6 7 8 9 10 11 12 | boolisUnique3(strings) { intcheck=0; intlen=th(); for(inti=0;i<len;++i) { intv=(int)(s[i]-'a'); if(check&(1<<v))returnfalse; check|=(1<<v); } returntrue; } |
【JAVA實現】
1 2 3 4 5 6 7 8 9 | publicstaticbooleanisUniqueChars(Stringstr){ intchecker=0; for(inti=0;i<th();++i){ intval=At(i)-‘a’; if((checker&(1<<val))>0)returnfalse; checker|=(1<<val); } returntrue; } |
1 2 3 4 5 6 7 8 9 | publicstaticbooleanisUniqueChars2(Stringstr){ boolean[]char_set=newboolean[256]; for(inti=0;i<th();i++){ intval=At(i); if(char_set[val])returnfalse; char_set[val]=true; } returntrue; } |
-
銷售面試注意事項通用
銷售面試注意事項通用11、對事先準備好的行業及企業相關資料做一下整理,準備一份自己站在求職崗位上的對於企業後一些看法(雖然不一定會用到,但有備無患)。2、找出自己適合這個企業的理由,及自身的優勢(主要是與企業有關的),適時的秀給考官看,但要懂得分寸。3、要始終保...
-
行政面試自我評價
在平凡的學習、工作、生活中,許多人都需要寫自我評價,自我評價是個人對自己的思想、動機、行為和個性的評價。相信寫自我評價是一個讓許多人都頭痛的問題,以下是小編為大家收集的行政面試自我評價,僅供參考,歡迎大家閱讀。行政面試自我評價11.普通話標準,表達邏輯流...
-
面試的邀請函[精品15篇]
電子邀請函相對傳統紙質邀請函在資訊傳達方面具有很大優勢。在社會一步步向前發展的今天,我們經常會用到邀請函,那麼什麼樣的邀請函才是有效的呢?以下是小編幫大家整理的面試的邀請函,歡迎大家借鑑與參考,希望對大家有所幫助。面試的邀請函1尊敬的***先生/女士您好!...
-
跳槽面試注意事項
跳槽面試注意事項1一、跳槽面試需要注意什麼跳槽後面試時,通常會被問到的一個題目是——請描述一下你離開以前所供職單位的理由。這就需要我們集中智慧,巧妙的避開陷阱。“你為什麼要離職?”在回答這個問題時應該集中精力。像人員臃腫阻礙了能力發揮、上班路途太...