zoukankan      html  css  js  c++  java
  • 《剑指offer》替换空格

    本题来自《剑指offer》 替换空格

    题目: 

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

    思路:

      方案一:空间优先,在原数组的基础上进行替换,没替换一次就将后面的字符串向后挪两个位置

          step1:查询空格的个数,在此基础上申请空格数两倍的位置

          step2:从后面向前遍历,如果遇到空格就加入‘’02%‘’,否则就继续挪动非空格字符,直到空格遍历完。代码采用了c++编程

      方案二:可申请额外的空间,当遇到空格就替换成'%20',采用python编程。

    C++ Code:

    class Solution {
    public:
        void replaceSpace(char *str,int length) {
            if (str == NULL || length <= 0){                    //审核为空或者length小于0直接返回
                return ;
            }
            int originallLength = 0;                            //定义数组原始长度
            int numberOfBlank = 0;                              //定义空格的长度
            int i = 0;
            while (str[i] != ''){                             //统计空格的个数
                originallLength ++;                
                if (str[i] == ' '){                            
                    numberOfBlank ++;
                }
                i++;
            }
            int newLength = originallLength + numberOfBlank * 2; //数组新的长度,假设传入的数组后面还有空格
            if (newLength > length){
                return ;
            }
            int newIndex = newLength;                            //赋予新长度的下标
            int originIndex = originallLength;                   //赋予原始数据的下标
            while (originIndex >= 0 && newIndex > originIndex){  //开始遍历,当原始下标越界或者新下标与原始下标持平便退出
                if (str[originIndex] == ' '){                    //当有空格时候,新数组的小标往前移动三个位置
                    str[newIndex --] = '0';                      //加入%20数据
                    str[newIndex --] = '2';
                    str[newIndex --] = '%';
                }else{
                    str[newIndex --] = str[originIndex];        //正常情况下,将前面的数据向后挪动
                }
                originIndex --;                                 //原始下标往前移动
            }
        }
    };

    Python Code:

    # -*- coding:utf-8 -*-
    class Solution:
        def replaceSpace(self, s):
            # write code here
            # s 源字符串
            # write code here
            s = list(s)
            count=len(s)
            for i in range(0,count):
                if s[i]==' ':
                    s[i]='%20'
            return ''.join(s)

    总结:

      根据需求,衡量的准则是时间和空间。

      若以时间换空间,则采用第一种方法,只需要申请其空格数量两倍的空间。

      若以空间换时间,则直接另外申请一块空间,遇到直接替换即可。

      若在数组中遇到前面的元素的操作会影响到后面的元素,可以考虑从面操作,前天是存储空间的充足。如果从前面操作,就不停的对后面数据进行造成影响,依次迭代,就会出现重复操作的,虽然可以,但是时间效率会比较高。若从后面操作就会只有一次操作了。

  • 相关阅读:
    url中特殊字符被转义成编码后如何处理
    解决:扰人的报错 Input length must be multiple of 8 when decrypting with padded cipher
    使用fastjson 进行jsonObject转实体类对象
    Mybatis之foreach遍历Map
    Map对象中的keyset()、entryset()和Map.Entry
    jdk的keytool生成jks和获取jks的信息,公匙
    postgres如何不插入重复的值
    docker查看日志记录
    Git Bash输错账号密码如何重新输入
    IntellIJ IDEA 配置 Maven 以及 修改 默认 Repository
  • 原文地址:https://www.cnblogs.com/missidiot/p/10750792.html
Copyright © 2011-2022 走看看