剑指offer系列2之替换空格

34 篇文章 0 订阅
15 篇文章 0 订阅

时空要求

  • 时间限制:1秒
  • 空间限制:32768K
  • 热度指数:795549
  • 本题知识点: 字符串

题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

解题思路

思路一

顺序遍历字符串并复制相应的字符到新的字符串中。时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n).

python实现
# -*- coding:utf-8 -*-
class Solution:
    # s 源字符串
    def replaceSpace(self, s):
        # write code here
        s_re = ''
        for char in s:
            if char == ' ':
                s_re += '%20'
            else:
                s_re += char
        return s_re
  • 运行时间:29ms
  • 占用内存:5864k

python可以利用list减小空间复杂度,即不需要开辟一个新的空间,直接在原字符串中插入。

# -*- coding:utf-8 -*-
class Solution:
    # s 源字符串
    def replaceSpace(self, s):
        # write code here
        s = list(s)
        length = len(s)
        for i in range(length):
            if s[i] == ' ':
                s[i] = '%20'
        s = ''.join(s)
        return s
  • 运行时间:28ms
  • 占用内存:5700k
# -*- coding:utf-8 -*-
class Solution:
    # s 源字符串
    def replaceSpace(self, s):
        # write code here
        s = s.replace(' ', '%20')
        return s
  • 运行时间:27ms
  • 占用内存:5736k
思路二

例:I am a student.
区别于第一种思路,该方法不需要另外开辟新的字符串来实现,而是通过插入移动的方法来实现。插入有两种实现方式,一种是从前面插入,一种是从后面插入。如果从前面插入,那么第一次需要移动13个字符,第二次需要移动10个字符,第三次需要移动8个字符,一共需要移动13+10+8=31次。时间复杂度为 O ( n 2 ) O(n^2) O(n2)。如果从后面插入,第一次需要移动8个字符,第二次需要移动1个字符,第三次需要移动2个字符,一共需要移动8+1+2=11次。时间复杂度为 O ( n ) O(n) O(n)
由于Python的字符串是不可变的,因此需要先转成list再进行操作。

python实现
# -*- coding:utf-8 -*-
class Solution:
    # s 源字符串
    def replaceSpace(self, s):
        # write code here
        s = list(s)
        count = 0
        for char in s:
            if char == ' ':
                count += 1
        
        for i in range(count):
            s.append('11')
            s.append('11')
        
        for i in range(len(s)-1, -1, -1):
            if s[i] != ' ':
                s[i+2*count] = s[i]
            else:
                count -= 1
                s[i+2*count] = '%'
                s[i+2*count+1] = '2'
                s[i+2*count+2] = '0'
        s = ''.join(s)
        return s             
C++实现
class Solution {
public:
	void replaceSpace(char *str,int length) {
        int count=0;
        for(int i=0; i<length; i++)
            if(str[i]==' ')
                count++;
        
        for(int i=length-1; i >=0; i--)
            if(str[i]!=' ')
                str[i+2*count]=str[i];
            else{
                count--;
                str[i+2*count]='%';
                str[i+2*count+1]='2';
                str[i+2*count+2]='0';
            }
	}
};
  • 运行时间:6ms
  • 占用内存:616k
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值