题目:实现一个函数,把字符串中的每个空格替换成”%20”。例如”I like it”,”I%20like%20it”
思路:如果直接每次遇到空格添加’%20’,那么空格后面的数字就需要频繁向后移动。遇到这种移动问题,我们可以尝试先给出最终需要的长度,然后从后向前扫描,同时给定两个指针来保证定位。
Java版本
public class replaceBlank {
//length:最大长度 originalLength:字符串的实际长度
public void replace(char string[],int length,int originalLength)
{
if(string == null || length <= 0)
{
return ;
}
int numberOfBlank = 0;
for(int i=0;i<originalLength;i++)
{
if(string[i] == ' ')
{
numberOfBlank++;
}
}
//newLength:替换后的字符串的长度
int newLength = originalLength + numberOfBlank * 2;
if(newLength > length)
return ;
//从后往前
int indexOfOriginal = originalLength-1;
int indexOfNew = newLength-1;
while(indexOfOriginal >= 0 && indexOfNew >= indexOfOriginal)
{
if(string[indexOfOriginal] == ' ')
{
string[indexOfNew--] = '0';
string[indexOfNew--] = '2';
string[indexOfNew--] = '%';
}
else
{
string[indexOfNew--] = string[indexOfOriginal];
}
indexOfOriginal--;
}
}
public static void output(String input,int max)
{
char[] output= new char[max];
if(input == null)
{
System.out.print("字符串输入错误");
return ;
}
int originalLength = input.length();
System.out.println("原字符串:"+ input);
for(int i=0;i<originalLength;i++)
{
char ch = input.charAt(i);
output[i] = ch;
}
replaceBlank a = new replaceBlank();
a.replace(output,max,originalLength);
System.out.print("现字符串:");
System.out.println(output);
}
public static void main(String[] args) {
int max=100;
String str1 = "hello world";// 空格在句子中间
output(str1,max);
String str2 = "hello world";// 连续有两个空格
output(str2,max);
String str3 = " helloworld";// 空格在句子开头
output(str3,max);
String str4 = " helloworld ";// 空格在句子末尾
output(str4,max);
String str5 = "";// 传入内容为空的字符串
output(str5,max);
String str6 = " ";// 传入内容为一个空格的字符串
output(str6,max);
String str7 = " ";// 传入的字符串全是空格
output(str7,max);
String str8 = null;// 传入NULL
output(str8,max);
}
}
Python版本:
# -*- coding:utf-8 -*-
# Python中string 不能改变,所以要创造一个新的string来进行操作
def replace(string,length):
if(string == None or length <= 0 or not isinstance(string,str)):
return ""
originalLength = len(string)
numberOfBlank = 0
for i in string:
if(i == ' '):
numberOfBlank += 1
newLength = originalLength + numberOfBlank * 2
if(newLength > length):
return
#从后往前
indexOfOriginal = originalLength-1
indexOfNew = newLength-1
newStr = newLength * [None]
while(indexOfOriginal >= 0 and indexOfNew >= indexOfOriginal):
if(string[indexOfOriginal] == ' '):
newStr[indexOfNew] = '0'
indexOfNew -= 1
newStr[indexOfNew] = '2'
indexOfNew -= 1
newStr[indexOfNew] = '%'
indexOfNew -= 1
else:
newStr[indexOfNew] = string[indexOfOriginal]
indexOfNew =indexOfNew- 1
indexOfOriginal -= 1
return "".join(newStr)
str1 = 'hello world' # 空格在句子中间
str2 = 'hello world' # 连续有两个空格
str3 = ' helloworld' # 空格在句子开头
str4 = '' # 空字符串
str5 = ' ' # 一个空格
str6 = ' ' # 全是空格
str7 = None # 传入None
str8 = 'None' # 传入字符串None
print('原字符串:',str1)
print('现字符串:',replace(str1,100))
print('原字符串:',str2)
print('现字符串:',replace(str2,100))
print('原字符串:',str3)
print('现字符串:',replace(str3,100))
print('原字符串:',str4)
print('现字符串:',replace(str4,100))
print('原字符串:',str5)
print('现字符串:',replace(str5,100))
print('原字符串:',str6)
print('现字符串:',replace(str6,100))
print('原字符串:',str7)
print('现字符串:',replace(str7,100))
print('原字符串:',str8)
print('现字符串:',replace(str8,100))