面试题5:替换空格

字符串

  • 在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.”
解释:

  1. str1和str2两个字符串数组,我们为他分配12字节的空间,并把"Hello World"的内容复制到数组中去。这是两个不同的数组,因此 str1 和 str2 的值也不相同。
  2. 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值