昨天參加WPS的筆試時,有一道題是要求寫一個函數實現字符串壓縮,舉個例子:
輸入:aaabbccccc
輸出:a3b2c5
當時總想着怎麼把輸入的字符串str改寫成輸出那壓縮形式,如果要修改字符串的話需要考慮的問題比較多:
定義一個int count對重複的字符進行計數,結束重複時要如何將這個count轉換成char類型加入字符串?個位數的重複比較簡單,如果一個字符的重複是十位數百位數千位數呢?
是要重新定義一個字符串還是在原字符串修改呢?如果是重新定義字符串還要考慮該局部函數在結束的時候數組也會跟着被銷燬的問題。如果是在原字符串修改的話在處理無連續重複的字符時也需要謹慎處理。
總之,要考慮的問題如此之多,在這麼短的筆試時間內,這種費時費力的思路應該早早放棄纔對,而昨天就是對以上的問題進行死磕,導致時間不夠用,結果很不理想。
接下來是另一種思路,簡單粗暴!題目要求只是一個輸出,那就直接邊計數邊printf輸出好了,完全拋棄對字符串做修改或者新建一個字符串的老路。
這樣的話代碼就變得十分簡短了:
#include <stdio.h> #define N 100 void compress(char str[]); void main(void){ char str[N]; printf("Enter a string:\n"); scanf("%Ns", str); compress(str); } void compress(char str[]){ int i = 0, cnt = 1; while(str[i] != '\0'){ if(str[i+1] == str[i]) cnt++; else{ printf("%c%d", str[i], cnt); cnt = 1; } i++; } printf("\n"); }
測試如下:
這樣或許達不到在內存中的壓縮效果,反正題目中沒要求,或許出題的意圖也只是想要視覺上的壓縮效果而已。