题目:
题1:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy
知识点:
- 字符串是不可迭代的,若想迭代字符串,可以转成字节;判断字符串中有几个' ':str.charAt(i)==‘ ’
- 设置stringBuffer中某位的值,str.setCharAt(index, '0')
注意:
- 写代码之前,先将输入的范围固定
- java中字符串用‘ ’
代码实现(java):
题1:
- 从左往右替换时间复杂度O(n²)
- 从右往左替换时间复杂度O(n):先计算字符串中有多少空格,确定替换后字符串的长度(原p1,现p2);接下来将原位置的字符串依次替换至新位置。
private static String change(StringBuffer str) {
if(str==null){
return null;
}
//定位p1、p2的位置,依次左移赋值
int count = 0;
for(int i=0; i<str.length(); i++) {
if(str.charAt(i)==' ') {
count++;
}
}
int p1 = str.length()-1;
str.setLength(str.length() + 2*count);
int p2 = str.length()-1;
while(p2>=p1&&p1>=0) {
if(str.charAt(p1)==' ') {
str.setCharAt(p2, '0');
str.setCharAt(p2-1, '2');
str.setCharAt(p2-2, '%');
p2-=3;
p1--;
}else {
str.setCharAt(p2, str.charAt(p1));
p2--;
p1--;
}
}
return str.toString();
}
题2:有两个有序的数组A1和A2,A1末尾有足够空间容纳A2。实现一个函数将A2的所有数字插入到A1中,并且所有数字是有序的。
private static int[] merge(int[] A1, int[] A2) {
if(A1==null) {
return null;
}
int count = 0;
for(int i:A1) {
if(i!= 0) {
count++;
}
}
int A1Index = count-1;
int A2Index = A2.length-1;
int allIndex = count + A2.length -1;
while(allIndex>=0) {
if(A1Index <0) {
A1[allIndex--] = A2[A2Index--];
}else if(A2Index <0) {
A1[allIndex--] = A1[A1Index--];
}else if(A1[A1Index]>=A2[A2Index]){
A1[allIndex--] = A1[A1Index--];
}else {
A1[allIndex--] = A2[A2Index--];
}
}
return A1;
}
思考:是不是所有的替换和插入,从时间空间复杂度来说,都最好从后往前插更好呢
代码实现(C++):
void replaceSpace(char *str, int length) {
if (str == NULL && length <= 0)
return;
/*strLength表示str的实际长度、numberOfBlank*/
int strLength = 0;
int numberOfBlank = 0;
for (int i = 0; str[i] != '\0'; i++) // '\0'代表空字符
{
++strLength;
if(str[i]==' ')
++numberOfBlank;
}
/*str的新长度*/
int newStrLength = strLength + numberOfBlank*2;
/*定义两个指针*/
int indexOfOld = strLength;
int indexOfNew = newStrLength;
/*依次从右往左遍历*/
/*当indexOfOld至0或者indexOfOld=indexOfNew,退出*/
while (indexOfOld >= 0 && indexOfNew > indexOfOld)
{
/*indexOfOld找到' ',对应indexOfNew替换*/
if (str[indexOfOld] == ' ')
{
str[indexOfNew--] = '0';
str[indexOfNew--] = '2';
str[indexOfNew--] = '%';
}
else {
str[indexOfNew--] = str[indexOfOld];
}
--indexOfOld;
}
}
int main()
{
const int length = 100;
char str[length] = " helloworld";
cout << str << endl;
replaceSpace(str, length);
cout << str << endl;
getchar();
return 0;
}