给定一个string iniString 及其长度 int len, 已知该字符串中有空格,现要求编写程序将字符串中空格替换为“%20”。返回更改后的string。假设该字符串有足够的空间存放新增的字符,并且知道原字符的长度(小于等于1000),同时保证字符串由大小写的英文字母组成。
测试样例:
"Mr John Smith”,13
返回:"Mr%20John%20Smith"
”Hello World”,12
返回:”Hello%20%20World”
给定一个string iniString 及其长度 int len, 已知该字符串中有空格,现要求编写程序将字符串中空格替换为“%20”。返回更改后的string。假设该字符串有足够的空间存放新增的字符,并且知道原字符的长度(小于等于1000),同时保证字符串由大小写的英文字母组成。
"Mr John Smith”,13
返回:"Mr%20John%20Smith"
”Hello World”,12
返回:”Hello%20%20World”
解法1 import java.util.*; public class Replacement { public String replaceSpace(String iniString, int length) { // 如果允许分配额外空间 if (iniString == null || iniString.length() <= 0) return iniString; StringBuffer sb = new StringBuffer(); for (int i = 0; i < length; i++) { char c = iniString.charAt(i); if (c == ' ') sb.append("%20"); else sb.append(c); } return sb.toString(); } } 解法2 public String replaceSpace(String str) { char[] charArr = str.toCharArray(); // 计算源字符串的长度和空格的数量 int originalLength = charArr.length; int numberOfBlank = 0; for (char item : charArr) if (item == ' ') numberOfBlank++; // 计算新的字符串长度 int newLength = originalLength + numberOfBlank * 2; char[] newcharArr = new char[newLength]; // int indexOfOriginal = originalLength - 1; int indexOfNew = newLength - 1; while (indexOfOriginal >= 0) { if (charArr[indexOfOriginal] == ' ') { newcharArr[indexOfNew--] = '0'; newcharArr[indexOfNew--] = '2'; newcharArr[indexOfNew--] = '%'; indexOfOriginal--; } else { newcharArr[indexOfNew--] = charArr[indexOfOriginal--]; } } return String.valueOf(newcharArr); }
// 我觉得能用正则干嘛不用呢... public String replaceSpace(String iniString, int length) { return iniString.replaceAll(" ", "%20"); } // 或者 public String replaceSpace(String iniString, int length) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < length; i++) { char c = iniString.charAt(i); if(c == ' '){ sb.append("%20"); }else{ sb.append(c); } } return sb.toString(); }
void resize (size_t n); void resize (size_t n, char c);
class Replacement { public: string replaceSpace(string iniString, int length) { if(length<=0) return iniString; int blank = 0; for(int i=0;i<length;++i) if(iniString[i]==' ') ++blank; int newLength = length+(blank<<1); iniString.resize(newLength); int index1 = length-1; int index2 = newLength-1; while(index1>=0 && index2>index1){ if(iniString[index1]==' '){ iniString[index2--]='0'; iniString[index2--]='2'; iniString[index2--]='%'; } else iniString[index2--]=iniString[index1]; --index1; } return iniString; } };
class Replacement { public: string replaceSpace(string iniString, int length) { // write code here string newStr; for (int i = 0; i < length; i++){ if (iniString[i] == ' '){ newStr.push_back('%'); newStr.push_back('2'); newStr.push_back('0'); } else{ newStr.push_back(iniString[i]); } } return newStr; } };
string replaceSpace(string iniString, int length) { int spaceCnt = 0; for(int i = 0; i < length; ++i) if(iniString[i] == ' ') spaceCnt++; int newLength = length + 2*spaceCnt; iniString.resize(newLength); //不知道输入iniString是否有足够的空间,所以直接resize. for(int i = length-1; i >= 0; --i){ if(iniString[i] == ' '){ iniString[--newLength] = '0'; iniString[--newLength] = '2'; iniString[--newLength] = '%'; } else iniString[--newLength] = iniString[i]; } return iniString; }
class Replacement { public: string replaceSpace(string iniString, int length) { // write code here string newString; for(int i=0;i<length;i++) { if(iniString[i]==' ') { //newString+=iniString[i]; newString=newString+"%20"; continue; } newString+=iniString[i]; } return newString; } };
//有疑问,我的输出会多一块,我以为指针越界了然而半天没找到问题在哪里,只好最后强制字符串终结才过,求解决方案? class Replacement { public: string replaceSpace(string iniString, int length) { // write code here int count=0; for(int i=0;i<length;i++) { if(iniString[i]==' ') count++; } int size=length+2*count; string temp; for(int p=0;p<size;p++) { temp[p]=' '; } for(int j=0,k=0;k<size;j++) { if(iniString[j]==' ') { temp[k++]='%'; temp[k++]='2'; temp[k++]='0'; } else if(iniString[j]=='\0'){ break; } else { temp[k++]=iniString[j]; } } temp[size]='\0'; return temp; } };
class Replacement { public: string replaceSpace(string iniString, int length) { string final; for (int i = 0; i < length; i++) { if (iniString[i]==' ') { final += "%20"; } else if (iniString[i]!=' ') { final += iniString[i]; } } return final; } };
我是对照着书来做的题目。
这道题目的本意是为了考察数组内的移动,本身题目的参数就给得有问题
我认为题目应该是这样的:
public String replaceSpaceA(char[] iniCharArr, int length) {
// 计算出新的长度
int spaceCount = 0;
for (int i = 0; i < length; i++) {
if (iniCharArr[i] == ' ') {
spaceCount ++;
}
}
// 从后面开始移起
int startIndex = length - 1;
int newLengthIndex = length + spaceCount * 2 -1;
while (startIndex != newLengthIndex) {
char moveChar = iniCharArr[startIndex];
if (moveChar == ' ') {
iniCharArr[newLengthIndex] = '0';
iniCharArr[newLengthIndex-1] = '2';
iniCharArr[newLengthIndex-2] = '%';
newLengthIndex -= 3;
} else {
iniCharArr[newLengthIndex] = moveChar;
newLengthIndex--;
}
startIndex--;
}
// 要截取一下,否则会通不过测试
return new String(iniCharArr, 0, length + spaceCount * 2);
}
};
//方式一: public String replaceSpace(String iniString, int length) { if(iniString==null||"".equals(iniString)||length<=0) return iniString; return iniString.replace(" ","%20"); } //方式二 public String replaceSpace(String iniString, int length) { if(iniString==null||"".equals(iniString)||length<=0||iniString.length()!=length) return iniString; StringBuffer sb=new StringBuffer(""); for(int i=0;i<length;i++){ if(iniString.charAt(i)==' ') sb.append("%20"); else sb.append(iniString.charAt(i)); } return sb.toString(); } //方法三:一样的道理 public String replaceSpace(String iniString, int length) { if(iniString==null||"".equals(iniString)||length<=0||iniString.length()!=length) return iniString; StringBuffer str=new StringBuffer(iniString); str.insert(0,'#'); str.append('#'); String[] value=str.toString().split(" "); StringBuffer sb=new StringBuffer(); for(int i=0;i<value.length;i++){ sb.append(value[i]); if(i==value.length-1) break; else sb.append("%20"); } sb.deleteCharAt(0); sb.deleteCharAt(sb.length()-1); return sb.toString(); }