题目描述
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路分析:
可以想到两种解决方案
第一种创建新的字符串,在新的字符串中进行替换
第二种就是在原来的字符串上做替换,并且保证输入的字符串后面有足够多的多余空间
这里我用的是第二种在原来字符串上进行替换,替换的顺序有两种,从前向后替换和从后向前替换,从前向后替换时间复杂度为 O(n2) ,所以还是采用的从后向前替换的方法,这样的话,字符挪动的次数就是一次,也就字符串长度为n,时间复杂为 O(n)
具体实现及相关过程:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void replaceBlank(char *s, int length);
void replaceBlank(char *s, int length) {
int originLength = 0,
newLength = 0,
numberOfBlank = 0,
i = 0,
originIndex = 0,
newIndex = 0;
//得到实际字符串的长度和空格的个数
while(s[i] != '\0') {
originLength++;
if(s[i] == ' ') {
numberOfBlank++;
}
i++;
}
//计算出新的字符串的长度(一个空格使得长度增加2)
newLength = originLength + numberOfBlank * 2;
//originIndex指向原来字符串的最后一个字符
originIndex = originLength;
//newIndex指向新字符串的最后一个字符
newIndex = newLength;
/*
当originIndex指向的是一个空格的时候,就需要用'%20'进行替换
(这个过程中newIndex需要移动三个位置),否则就要进行复制,
将originIndex所指向的字符复制到newIndex所指向的位置,然后
originIndex不断向前移动
*/
while(originIndex >= 0 && newIndex > originIndex) {
if(s[originIndex] == ' ') {
s[newIndex--] = '0';
s[newIndex--] = '2';
s[newIndex--] = '%';
} else {
s[newIndex--] = s[originIndex];
}
originIndex--;
}
}
void main(void) {
char s[100];
gets(s);
replaceBlank(s, 100);
puts(s);
}
创建新的字符串的解法:
package com.offer.exec;
import java.util.Scanner;
public class ReplaceBlank {
public String replace(StringBuffer s) {
if(s == null) {
return null;
}
StringBuffer str = new StringBuffer();
for(int i = 0; i < s.length(); i++) {
if(s.charAt(i) == ' ') {
str.append('%');
str.append('2');
str.append('0');
}else {
str.append(s.charAt(i));
}
}
return str.toString();
}
public static void main(String args[]) {
ReplaceBlank rb = new ReplaceBlank();
StringBuffer sb = new StringBuffer();
Scanner in = new Scanner(System.in);
sb.append(in.nextLine());
System.out.println(rb.replace(sb));
}
}