剑指offer之面试题5:替换空格

本文介绍了一种高效的字符串空格替换算法,通过两次遍历,实现了将字符串中的空格替换成“%20”,适用于Python及C++环境,提供了解决方案的详细步骤和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、题目

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

2、解题思路

python:

解题思路1:直接使用Python字符串的内置函数。(通过)

解题思路2:剑指offer中的思路

C++

解题思路2:剑指offer中的思路

最简单的方法就是从头到尾遍历,但是时间复杂度为O(n^2)

本文采用一种时间复杂度为O(n)的方法。

我们可以先遍历一次字符串,这样就可以统计出字符串空格的总数,并可以由此计算出替换之后的字符串的总长度。每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2乘以空格数目。以”We are happy”为例,”We are happy”这个字符串的长度为14(包括结尾符号”\n”),里面有两个空格,因此替换之后字符串的长度是18。

我们从字符串的尾部开始复制和替换。首先准备两个指针,P1和P2,P1指向原始字符串的末尾,而P2指向替换之后的字符串的末尾。接下来我们向前移动指针P1,逐个把它指向的字符复制到P2指向的位置,直到碰到第一个空格为止。碰到第一个空格之后,把P1向前移动1格,在P2之前插入字符串”%20”。由于”%20”的长度为3,同时也要把P2向前移动3格。

移动示意图:


3、Python 2.7.12版本实现(因为牛客网上为2.7版本)

3.1、自己写的(通过)

# -*- coding:utf-8 -*-
class Solution:
    # s 源字符串
    def replaceSpace(self, s):
        new_list = []
        str_list = list(s)
        length = len(str_list)
        for i in range(length):
            if str_list[i] != " ":
                new_list.append(str_list[i])
            else:
                new_list.append('%20')
        return (''.join(new_list))

if __name__ == "__main__":
    str= "We Are Happy"
    solution = Solution()
    new_str = solution.replaceSpace(str)
    print new_str

3.2、根据参考文献改进后的

# -*- coding:utf-8 -*-

'''
剑指offer之面试题5:替换空格

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

思路:
见程序标注

编程环境:
Python2.7.12

作者:
优快云博客:https://my.youkuaiyun.com/yeqiang19910412
Github:https://github.com/YeQiang1075736553

日期:
2018.8.20
'''

#-*- coding:utf-8 -*-
class Solution:
    # s 源字符串
    def replaceSpace(self, s):
        """
        剑指offer中的思路:(通过)
        step1:统计空格个数
        step2:计算替换后的字符串长度
        step:从字符串的后面开始复制和替换
        """
        if not isinstance(s,str) or len(s) <= 0 or s == None: # 判断非法输入
            return None

        original_length = len(s)

        space_num = 0
        for i in range(original_length): # 统计空格数
            if s[i] == ' ':
                space_num += 1

        new_str_length = original_length + space_num * 2
        new_str = new_str_length * [None]

        index_original = original_length - 1
        index_new = new_str_length -1

        while index_original >= 0 :
            if s[index_original] == ' ': # 有空格就插入
                new_str[index_new] = '0'
                new_str[index_new-1] = '2'
                new_str[index_new-2] = '%'
                index_original -= 1
                index_new -= 3
            else:
                new_str[index_new] = s[index_original]
                index_original -= 1
                index_new -= 1

        return ''.join(new_str)

if __name__ == "__main__":
    str1= "We Are Happy"
    solution = Solution()
    str2 = solution.replaceSpace(str1)
    print str2

GitHub 代码地址 :GitHub 代码地址 t5.py

4、C++版本实现

#include"iostream"
using namespace std;

/*************************************************
剑指offer之面试题5:替换空格

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


思路:
见程序标注

编程环境:
visual studio 2017

作者:
优快云博客:https://my.youkuaiyun.com/yeqiang19910412
Github:https://github.com/YeQiang1075736553

日期:
2018.8.20
**************************************************/

class Solution {
public:
    void replaceSpace(char *str, int length) {
        /**
        * @brief 剑指offer中的思路:
        * step1:统计空格个数
        * step2:计算替换后的字符串长度
        * step:从字符串的后面开始复制和替换

        * @param *str char 字符串
        * @param length  int 字符串的长度
        *
        * @return char 返回插入后的字符串
        *
        */
        if (str == nullptr && length <= 0) {
            return;
        }

        int originalLength = 0; 
        int numberOfBlack = 0;

        // 统计空格数
        int i = 0;
        while (str[i] != '\0') {
            ++originalLength; // 不包括'\0'
            if (str[i] == ' ') {
                ++numberOfBlack;
            }
            ++i;
        }

        int indexOfOriginal = originalLength; // indexOfOriginal = 13
        int indexOfNew = originalLength + numberOfBlack * 2; // indexOfNew = 17

        cout << indexOfNew << endl;
        cout << indexOfOriginal << endl;

        while (indexOfOriginal>=0)
        {
            if (str[indexOfOriginal] == ' ') {
                str[indexOfNew] = '0';
                str[indexOfNew-1] = '2';
                str[indexOfNew-2] = '%';
                indexOfNew -= 3;
                indexOfOriginal -= 1;
            }
            else {
                str[indexOfNew] = str[indexOfOriginal];
                indexOfNew -= 1;
                indexOfOriginal -= 1;
            }
        }
    }
};

/////////////////////////////////////////////////////////////////////////////////////////////

//class Solution {
//public:
//  void replaceSpace(char *str, int length)
//  {
//      // 剑指offer源代码
//      if (str == nullptr && length <= 0)
//          return;
//
//      /*originalLength 为字符串str的实际长度*/
//      int originalLength = 0;
//      int numberOfBlank = 0;
//      int i = 0;
//      while (str[i] != '\0')
//      {
//          ++originalLength;
//
//          if (str[i] == ' ')
//              ++numberOfBlank;
//
//          ++i;
//      }
//      /*newLength 为把空格替换成'%20'之后的长度*/
//      int newLength = originalLength + numberOfBlank * 2;
//      int indexOfOriginal = originalLength;
//      int indexOfNew = newLength;
//      cout << indexOfNew << endl;
//      cout << indexOfOriginal << endl;
//      while (indexOfOriginal >= 0)
//      {
//          if (str[indexOfOriginal] == ' ')
//          {
//              str[indexOfNew--] = '0';
//              str[indexOfNew--] = '2';
//              str[indexOfNew--] = '%';
//          }
//          else
//          {
//              str[indexOfNew--] = str[indexOfOriginal];
//          }
//
//          --indexOfOriginal;
//      }
//  }
//};

int main(void) {
    char str[] = "We Are Happy.";
    int length = sizeof(str) / sizeof(str[0]) ; // 包括'\0'
    Solution solution;
    solution.replaceSpace(str, length);
    cout << str << endl;
    system("pause");
    return 0;
}

GitHub 代码地址 :GitHub 代码地址 t5.cpp

参考文献:
1. Jack-Lee-Hiter/AlgorithmsByPython/Target Offer/替换空格.py:解题思路1:直接使用Python字符串的内置函数。
2. gatieme/CodingInterviews/004-替换空格:C++
3. 剑指Offer(二):替换空格:C++

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值