一、問題描述
輸入一個字符串,注意是可以帶空格的,我們所要做的是如果字符之間有很多個連續的空格,我們只需要保留一個空格,並輸出顯示。
有一個類似的問題,是將一個數中連續相同的數刪除掉,只保留其中一個數,如3456667,轉化為34567。這個問題與字符串的問題大體上是一致的,
只是字符串限定了只有連續的空格需要處理,連續的其他字符是可以接受的,如abbbc是滿足條件的,而a bbb ccc則要轉換為a bbb ccc.
二、問題分析
在書寫程序的過程中,首先的思路是以空間換取時間,使得該問題的時間復雜度為線性復雜度O(n)。
先用一個字符數組b存取字符串a的第一個元素,然后依次比較b中的最后一個元素與a中的下一個元素。
如果兩者不同,很明顯把a中的這個元素加入b數組;
如果兩者相同,但是不是空格,則也滿足條件,把a中的這個元素加入數組;
其余的條件就是兩者相同,但是都是空格,為了避免出現連續的空格,所以不加入這個元素;
下面將舉個簡單的例子:字符串1 :ab cd edd;數組2第一個元素設為字符串1的第一個元素a;
開始比較字符串下一個元素b和數組2最后一個元素a,發現滿足,即數組2變成ab;接着比較字符串的空格與數組2的最后一個元素b,發現不相等,繼續加入;
數組2變成ab .然后發現字符串的下一個元素還是空格,與數組2的最后一個元素是相同的,舍棄;依次類推,我們便可以得到ab cd edd這個結果。
如果是要刪除數中連續相同的數,保留一個,那么做法類似,甚至更簡單,直接比較是否相等,相等舍棄,不等加入。
三、程序設計
(1)字符串刪除連續空格,保留一個空格的程序:
其中需要注意的是getline函數,之前無腦直接采用cin,忽略了cin是以空格為結束符,所以根本讀取不了,直接在輸入就錯誤了;
getline則可以實現輸入含有空格的各種字符串;
(2)刪除數中連續相同的數,保留一個數
四、程序結果
(1)
(2)
五、利用C++現成的算法庫實現
(1)字符串刪除連續空格,保留一個空格的程序:
(2)刪除數中連續相同的數,保留一個數:
只需將unique中的第三個參數刪除掉就可以,不適用二元謂詞函數
這是這樣做會使程序大大的縮短,但是本質都是一樣的。
綜上,在學習中要多思考類似的問題,可以達到比較好的效果,學習效率也會提高!