天天看點

百度:替換和清除空格

一、替換字元

      題目:請實作一個函數,把字元串中的每個空格替換成“%20”。例如輸入“We are happy.”,則輸出“We%20are%20happy.”。

      将長度為1的空格替換為長度為3的“%20”,字元差的産度變長。如果允許我們開辟一個新的數組(用Java的StringBuilder這樣的可變字元串,String是不可變字元串)來存放替換空格後的字元串,那麼這道題目就非常簡單。設定兩個指針分别指向新舊字元串首元素,周遊原字元串,如果碰到空格就在新字元串上填入“%20”,否則就複制元字元串上的内容。但是如果面試官要求在原先的字元串上操作,并且保證原字元串有足夠長的空間來存放替換後的字元串,那麼我們就得另想方法。

      如果從前往後替換字元串,那麼儲存在空格後面的字元串肯定會被覆寫,那麼我們就考慮從後往前進行替換。

  1. 首先周遊原字元串,找出字元串的長度以及其中的空格數量,
  2. 根據原字元串的長度和空格的數量我們可以求出最後新字元串的長度。
  3. 設定兩個指針originalIndex和newIndex分别指向原字元串和新字元串的末尾位置。
  4. 如果originalIndex指向内容不為空格,那麼将内容指派給newIndex指向的位置,如果originalIndex指向為空格,那麼從newIndex開始指派“02%”
  5. 直到originalIndex==newIndex時表明字元串中的所有空格都已經替換完畢。

      Java做的話直接replaceAll,不過這樣的題,面試官會要求你用C寫。

二、清除空格

      題目:請實作一個函數,把字元串中的每個空格清除掉。例如輸入“We are happy.”,則輸出“Wearehappy.”。

      這道題目是需要清楚空格,那麼清除空格後所得到的字元串要比原先的字元串要短,這是我們從頭到尾進行清楚空格的話就不會覆寫到空格後面的字元,是以我們可以從頭開始清除。

      參考文獻http://www.cnblogs.com/xwdreamer/archive/2012/05/08/2490033.html

三、清除多餘空格

      題目:給定字元串,删除開始和結尾處的空格,并将中間的多個連續的空格合并成一個。例如輸入"  We   are   happy.   ",則輸出"We are happy."

      這道題目跟第二題類似,都是需要删除空格,這樣可以肯定輸出的字元串長度小于等于原先字元串的長度,那麼就可以從頭往後周遊而不怕後面的字元被覆寫。因為需要删除開始和結尾處處的空格,而字元串中間的空格又需要儲存一個,我們需要進行另外的處理。我們可以通過設定一個辨別位來進行處理,定義一個bool變量keep_space表示是否儲存一個空格,如果keep_space=true表示儲存一個空格,如果keep_space=false則不儲存空格。初始化的時候将keep_space設為false,這樣開始階段的空格都不會被儲存,當碰到一個不為空格的字元是,儲存該字元,然後設定keep_space=true表明會儲存字元串中的第一個空格,這樣在碰到第一個個空格時就能夠儲存。

      在字元串結果,經過上述幾步操作,可以保證字元串結尾要麼是非空字元,要門是一個空字元,這樣進行一次判斷就好了,如果是空格字元,這将該空格設為'\0',如果不為空字元,則在其後面加上'\0'。

      這個真心贊。

      其實這些都可以用replaceAll函數,不管效率的話,現在很多國家級項目貌似就是這樣做的,隻需要你做出來,不管效率,而且很有可能做出來的是錯的,哎。