小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
问题
请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“Weare happy.”,则输出“We%20are%20happy.”
假设在原来的字符串上做替换, 并且该字符串后面有足够多的空余内存.
自己的思路
当我看到这个问题时, 首先想到的是, 创建两个索引, 一个索引进行有效字符串的遍历, 一个索引指向整个字符串的末尾
当遇到一个空格时, 就将 %20放入字符串的末尾
然后判断字符串的末尾是否有数据,
如果不为空, 则根据遍历索引依次将末尾这些字符和有效字符串中的字符进行交换
按照这种原则直到遍历到有效字符串的末尾
出现的问题
每次将字符串末尾的字符放到有效字符串中时, 都需要进行数据的交互
并且每次都要记录多个索引, 一个遍历有效字符串的索引, 一个字符串末尾记录要进行移动的字符的索引
在遍历有效字符串的时候要进行很多种情况的判断
比较好的思路
从后向前遍历字符串并且进行移动
首先遍历一个字符串, 进行字符的统计和空格的统计, 由于将空格' '替换成%20, 从一个字符串变成了成一个字符串, 因此每有一个字符, 字符串的长度就会+2
首先, 定义两个索引, srcEndIdx指向原字符串的末尾, dstEndIdx指向替换后的字符串的末尾
当srcEndIdx没有遇到空格时, 将遍历的字符放到dstEndIdex位置, 再将srcEndIdx前移动1格, , dstEndIdx也向前移动一格
当srcEndIdx遇到空格时, 将srcEndIdx向前移动1格, 将dstEndIdx向前移动3格依次将02%放到字符串中
直到两个索引指向相同的位置时, 则将整个字符串遍历完毕
代码
private static void replaceSpace(char string[]) {
// 数组正确性判断
if (string == null || string.length == 0) {
return;
}
System.out.println("数组总长度: " + string.length);
// 统计空格数量
int space = 0;
int charCount = 0;
int i = 0;
while (string[i] != '\0') {
charCount++;
if (string[i] == ' ') {
space++;
}
i++;
}
// 从' '(空格)替换成%20, 表明有一个空格, 字符串长度都为+2
int resStrLen = charCount + space * 2;
// 如果空格数量为0或者替换空格后的长度大于数组总长度, 则不用走下面的流程
if (space == 0 || resStrLen > string.length) {
return;
}
// 替换空格后的字符串总长度
System.out.println("替换空格前的长度: " + charCount);
System.out.println("替换空格后的长度: " + resStrLen);
// 该下标表明替换空格前的最后一个字符的位置
int srcEndIdx = charCount - 1;
// 该下标表明替换空格后的最后一个字符的位置
int dstEndIdx = resStrLen - 1;
// 当两个索引相等时, 表明字符串中的所有空格都已经替换完
while (dstEndIdx > srcEndIdx && srcEndIdx >= 0) {
// 如果不是空格则进行字符的移动
if (string[srcEndIdx] != ' ') {
System.out.print(string[srcEndIdx] + " ");
string[dstEndIdx--] = string[srcEndIdx];
} else { // 如果是空格, 则写入对应的%20三个字符
string[dstEndIdx--] = '0';
string[dstEndIdx--] = '2';
string[dstEndIdx--] = '%';
}
srcEndIdx--;
}
System.out.println();
// 替换完后的字符数组
System.out.println(string);
}
总结
要学会培养自己的思维散发能力, 不要拘泥于一格, 要学会从多方面多角度思考问题. 通过本文我们可以对字符串有了更清楚的认识.当遇到问题时, 我们要学会发散自己的思维, 不要不撞南墙不回头, 顺序不行, 我们可以逆序来, 总有一种比较好的解决问题的方式!