P51ソードはオファーを指します:スペースを交換してください
文字列内の各スペースを「%20」に置き換える関数を実装してください。たとえば、「We happy。」と入力した場合は、「We%20are%20happy。」と入力します。
コードは次のように表示されます。
アイデア:文字列内のスペースを後ろから前に「%20」に置き換えます。
時間計算量:O(n)
/* 替换空格 */
/* length为字符数组string的总容量 */
void ReplaceBlank(char* string, int length)
{
/* 判断非法测试 */
if (string == nullptr || length <= 0)
return;
/* OriginalLength为字符串string的实际长度 */
int OriginalLength = 0;
int NumberOfBlank = 0;
int i = 0;
while (string[i] != '\0')
{
OriginalLength++;
if (string[i] == ' ')
NumberOfBlank++;
i++;
}
/* NewLength为字符串string中的空格替换成'%20'之后的长度 */
int NewLength = OriginalLength + NumberOfBlank * 2;
/* 数组string放不下替换之后的字符串,则不进行替换 */
if (NewLength > length)
return;
int IndexOfOiginal = OriginalLength;
int IndexOfNew = NewLength;
while (IndexOfOiginal >= 0 && IndexOfNew > IndexOfOiginal)
{
if (string[IndexOfOiginal] == ' ')
{
string[IndexOfNew--] = '0';
string[IndexOfNew--] = '2';
string[IndexOfNew--] = '%';
}
else
string[IndexOfNew--] = string[IndexOfOiginal];
IndexOfOiginal--;
}
}
int main()
{
/*
char a[] = "We are happy.";
导致栈溢出,因为这样定义会默认数组大小
利用下标访问数组会非法访问
*/
char a[18] = "We are happy.";
cout << "替换前:" << a << endl;
ReplaceBlank(a, 18);
cout << "替换后:" << a << endl;
return 0;
}