字符串
- 在C++中,字符串以’\0’结尾,而在Java中没有以什么结尾的说法
- C++把产量字符串放到单独的一个内存空间。。当几个指针赋值给相同的产量字符串时,它们实际上会指向相同的内存地址,下面举一个例子
int main(int argc, _TCHAR* argv[]) {
char str1[] = "Hello World";
char str2[] = "Hello World";
char* str3 = "Hello World";
char* str4 = "Hello World";
if (str1 == str2) {
printf("str1 and str2 are same.\n");
} else {
printf("str1 and str2 are not same.\n");
}
if (str3 == str4) {
printf("str3 and str4 are same.\n");
} else {
printf("str3 and str4 are not same.\n");
}
return 0;
}
以上的输出是:
“str1 and str2 are not same.”
“str3 and str4 are same.”
解释:
- str1和str2两个字符串数组,我们为他分配12字节的空间,并把"Hello World"的内容复制到数组中去。这是两个不同的数组,因此 str1 和 str2 的值也不相同。
- str3 和 str4 是两个指针,我们无需为他分配内存,只需要把他们指向"Hello World"在内存中的地址就可以了。由于"Hello World"是常量字符串,它在内存中只有一个拷贝,因此 str3 和 str4 是相同的。
面试题
题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如,输入"We are happy.",则输出"We%20are%20happy."。
方法1:直接法
每遍历一个空格,就把后面的字符串往后移两个字节,然后再替换
- 注意,在Java中,String类是不可变的,一旦创建了String对象,那它的值就不可改变了
- 时间复杂度O(n^2)
- 空间复杂度O(1)
方法2:先遍历一遍,找到空格数量,直接计算出新字符串长度,再一个个复制到新字符串中
- 时间复杂度O(n)
- 空间复杂度O(n)
public String replaceSpace(String s) {
if (s.length() == 0) {
return s;
}
int newLen = s.length();
int size = 0;
for (int j = 0; j < s.length(); j++) {
if (s.charAt(j) == ' ') {
newLen = newLen + 2;
}
}
char[] str = new char[newLen];
for (int i = 0; i < s.length; i++) {
// 找到一个空格
if (s.charAt(i) == ' ') {
str[size++] = '%';
str[size++] = '2';
str[size++] = '0';
} else { // 其他的原封保存
str[size++] = s.charAt(i);
}
}
String temp = new String(str, 0, size);
return temp;
}
力扣官方:另开一个字符串数组,长度是字符串长度的3倍,长度怎么都不会超过,边复制边计算新字符串长度
- 时间复杂度O(n)
- 空间复杂度O(n)
public String replaceSpace(String s) {
if (s.length() == 0) {
return s;
}
int length = s.length();
int size = 0; // size用于遍历字符数组,i用于String对象
char[] str = new char[length*3];
for (int i = 0; i < length; i++) {
// 找到一个空格
if (s.charAt(i) == ' ') {
str[size++] = '%';
str[size++] = '2';
str[size++] = '0';
} else { // 其他的原封保存
str[size++] = s.charAt(i);
}
}
String temp = new String(str, 0, size);
return temp;
}