题目见书《剑指offer》51页。
编程思路,与书一致;原本打算用一个指针的,但是随之而来的是时间复杂度变大。
//面试题5:替换空格
#include <iostream>
#include<string.h>
using namespace std;
//length为字符串的总容量
void ReplaceBlank(char string[], int length)
{
if (string == nullptr || length <= 0)
return;
int originalLength = 0;
int numberOfBank = 0;
int i = 0;
while (string[i] != '\0')
{
++originalLength;
if (string[i] == ' ')
++numberOfBank; //统计空格数量
++i;
}
int newLength = originalLength + numberOfBank * 2;
int indexOfOriginal = originalLength; //指向旧字符串末尾
int indexOfNew = newLength; //指向新字符串末尾
while (indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)
{
if (string[indexOfOriginal] == ' ')//indexOfNew与indexOfOriginal有关。
{
string[indexOfNew--] = '0';
string[indexOfNew--] = '2';
string[indexOfNew--] = '%';
}
else
{
string[indexOfNew--] = string[indexOfOriginal];
}
--indexOfOriginal;
}
}
int main()
{
const int l = 100;
char s[l] = "We are happy.";//注意指定字符串的长度,不然会内存越界。
cout << "源字符串:" << s << '\n';
ReplaceBlank(s, l);
cout << "替换后字符串:" << s << endl;
system("pause");
return 0;
}
结果如:
小技巧:代码中不加入system(“pause”); 结果界面闪退,可用快捷键ctrl+f5解决。