《劍指offer》面試題5 替換空格以及其衍生問題

2021-09-25 17:34:26 字數 1678 閱讀 8258

#define max 1000

char* replacespace1(char* str,int len)//開闢乙個陣列

p++;

} char *newstr = (char *)malloc(len + 2 * spacenum + 1);

int i = 0, j = 0;

for (; i < len; i++)

else

}newstr[j] = '\0';

strcpy(str, newstr);

str[strlen(newstr) + 1] = '\0';

free(newstr);

return str;

}char * replacespace2(char *str, int len)//在原陣列上操作

p++;

} if (!num)

return str;

int i = len;

int j = i + num * 2;

str[j + 1] = '\0';

for (; i>0; i--)

else

}return str;

}int main()

編碼完成下面的處理函式,函式將字串中的字元』『移到字串的前部分,前面的非』』

字元後移,但不能改變非』『字元的先後順序,函式返回串中非』'字元的數量。(要求盡可能的占用少的時間和輔助空間)。

例如:原始串為au**toc**h**i*ps,處理後為*******autochips,函式返回9.

int one(char *str)

else if (str[j] != '*')//j為字母&&i為* 發生交換

}return i + 1;

}int main()

; printf("%d", one(str));

return 0;

}

思路:

定義兩個變數 從字串尾部開始,開始i =j = strlen(str)-1;

當i != 『'時i,j同時向前移動

當i == '』 && j ==』』 時僅僅有j向前移動,因此i就停留在了從後往前的第乙個的位置

當i == '』 && j != ''時 i與j的元素發生交換

三種情況

發生事件

i !i-- j–

i= && j!

交換 i-- j–

i= && j=

j–輸入乙個字串,注意是可以帶空格的,我們所要做的是如果字元之間有很多個連續的空格,我們只需要保留乙個空格,並輸出顯示。

有乙個類似的問題,是將乙個數中連續相同的數刪除掉,只保留其中乙個數,如3456667,轉化為34567。這個問題與字串的問題大體上是一致的,

只是字串限定了只有連續的空格需要處理,連續的其他字元是可以接受的,如abbbc是滿足條件的,而a bbb ccc則要轉換為a bbb ccc.

char *deletespace(char *str, int len)

else if (str[i] == ' ' && str[i+1] != ' ')

}str[j] = '\0';

return str;

}int main()

劍指Offer 面試題5替換空格

note 劍指offer的題可以在牛客網上做題驗證思路的正確性 思路 因為stringbuffer本身是可變字串序列,可以修改,實際上它的可變是犧牲空間換取的。替換可能導致超出其容量,char陣列的複製和新建。public string replacespace stringbuffer str s...

劍指offer 面試題5 替換空格

拿到這個題時,第乙個要考慮的就是記憶體夠不夠的問題。因為原來空格是乙個字元,現在要將乙個空格替換為三個字元,記憶體會變大。現在假設是在記憶體足夠的情況下修改。過程如下 完成乙個空格的替換 完成替換 測試用例的考慮 如下 void changestr char arr,int sz int i 0 i...

劍指offer面試題5 替換空格

面試題5 替換空格 思路一 新建乙個足夠的大小的字串空間,然後依次將字元拷貝,遇到空格進行三個字元的填充,接著重複執行前面的操作將整個字串替換完畢。時間複雜度o n 空間複雜度o n 思路二 從頭到尾掃瞄字串,每次遇到空格將後續字元向後移動兩個位置,然後進行填充。時間複雜度o n 2 思路三 從尾部...