我們先看兩道看似簡單,但編碼起來容易出錯的字串演算法題。
這道題目的演算法實現不難,但要想寫出準確的**實現,也不容易。我們先看編碼,編碼演算法就是遍歷整個字串,統計每個字元連續出現的次數,然後將連續出現的字元轉換為次數和字元的組合,**如下:
public string encode(string s) else
}str += count;
str += last;
return str;
}
上面的編碼實現不難,但為什麼說使得**準確不容易呢,主要在於,大多數人在白板上寫**時,很容易忘記最後兩句:
str += count;
str += last;
漏了這兩句的話,字串」aaaabcccaa」 執行後的結果是」4a1b3c」,這種邊界條件的檢測和處理是檢驗候選人編碼功底是否紮實和心態是否嚴謹的重要手段,簡單的題目,95%的人都能寫出,但也只有5%的人能夠注意邊界條件,寫出完全正確的**,所以大家在平日積累和現場寫**時,一定要小心邊界問題的處理。
最後,解碼演算法也簡單,每次讀入兩個字元,第乙個字元是出現次數,第二個字元是對應重複出現的字元,**如下:
public string decode(string s)
}return str
給定乙個字串,它由若干個單詞組成,每個單詞間以空格分開。我們想對字串進行轉換,使得字串中單詞出現的順序發生逆轉,例如字串 「alice like bob」, 轉換後變為 「bob like alice」, 要求編寫演算法實現該轉換,同時演算法的空間複雜度必須為o(1).
我們先看看,字串反轉是怎麼做的,例如將字串「abcd」反轉後,結果為」dcba」, 字串反轉通常做法是用兩個指標,分別指向頭字元和尾字元,將指標指向的兩個字元交換,然後頭指標向後移動乙個位置,尾字元向前挪動乙個位置,當兩個指標位置互換時,反轉結束,例如:
->a b c d<-
前後指標字元交換後為:
d -> b c<- a
再次交換:
d c<- -> b a
由於兩個指標位置互換,倒轉結束。
單詞倒轉可以轉換為字元倒轉,首先將整個字串倒轉,例如」alice like bob」 字元倒轉後為 「bob ekil ecila」, 然後將每乙個單詞進行字元倒轉便有:
「bob like alice」
這樣我們的目的就達到了,由於字元倒轉不需要分配新的空間,因此整個演算法空間複雜度為o(1).
演算法實現如下:
public
class
wordreverse
public stringbuffer reverseword()
//反轉單詞
reversebychar(begin, end - 1);
begin = end + 1;
end = begin;
} while (end < inputstr.length());
return inputstr;
}private
void
reversebychar(int begin, int end)
while (begin < end)
}}
reversebychar 將整個字串進行基於字元的反轉,如果輸入字串為:」alice like bob」 執行該函式後,字串為:」bob ekil ecila」。
reverseword 在倒轉後的字串基礎上,通過空格查詢到每個單詞的起始和結尾,然後對每個單詞進行反轉,執行該函式後,字串轉換為:
「bob like alice」
這樣,我們的目的就實現了。
筆試面試題之字串
最大子串行 最大子串行是要找出由數組成的一維陣列中和最大的連續子串行。比如的最大子串行就是 它的和是8,達到最大 而 的最大子串行是,它的和是6。你已經看出來了,找最大子串行的方法很簡單,只要前i項的和還沒有小於0那麼子串行就一直向後擴充套件,否則丟棄之前的子串行開始新的子串行,同時我們要記下各個子...
C 面試題 之字串
基本上求職者進行筆試時沒有不考字串的。字串也是一種相對簡單的資料結構,容易引起面試官反 問。事實上,字串也是考驗 程式設計師程式設計規範和程式設計習慣的重要考點。不要忽視這些細節,因為這些細節會體現你在作業系統 軟體工程 邊界記憶體處理等方面的知識掌握能力,也會成為企業是否錄用你的參考因素。答案 i...
面試題目之刪除字串
問題描述 在給定字串中查詢所有特定子串並刪除,如果沒有找到相應子串,則不作任何操作。要求實現函式 int delete sub str const char str,const char sub str,char result str 輸入 str 輸入的被操作字串 sub str 需要查詢並刪除的...