/*
題目描述:
請實現一個函數,將一個字符串中的每個空格替換成“%20”。例如,當字符串爲We Are Happy.則經過替換之後的字符串爲We%20Are%20Happy。
思路:
問題1:替換字符串,是在原來的字符串上做替換,還是新開闢一個字符串做替換!
問題2:在當前字符串替換,怎麼替換才更有效率(不考慮java裏現有的replace方法)。
從前往後替換,後面的字符要不斷往後移動,要多次移動,所以效率低下
從後往前,先計算需要多少空間,然後從後往前移動,則每個字符只爲移動一次,這樣效率更高一點。
參數列表:
str 待替換字符串;length爲str字符串的最大容量;s爲原字符串中需要被替換的字符,這裏爲空格;p爲將要替換成的字符串,這裏爲“%20”
*/
void ReplaceSpace(char *str, int length, char s, char *p)
{
if (str == nullptr || length <= 0 || p == nullptr)
return;
int p_len = strlen(p);
if (p_len <= 1)
return;
int orignal_length = 0;
int count_of_balnk = 0;
for (int i = 0; str[i] != '\0'; i++)
{
orignal_length++; // 統計原字符串的長度
if (str[i] == s)
count_of_balnk++; // 統計原字符串中空格的長度
}
int new_length = orignal_length + count_of_balnk * (p_len - 1); // 計算新字符串長度
if (new_length +1 > length)
return;
int orignal_index = orignal_length; // 這裏最大索引爲字符串長度值,會複製結束符'\0'
int new_index = new_length;
while (orignal_index >= 0 && orignal_index < new_index)
{
if (str[orignal_index] == s)
for (int i = p_len -1; i >= 0; i--)
str[new_index--] = p[i];
else
str[new_index--] = str[orignal_index];
orignal_index--; // 每次處理一個原結尾字符,索引就前移一位
}
}