zoukankan      html  css  js  c++  java
  • 替换空格

    题目描述

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

    python:

    1 # -*- coding:utf-8 -*-
    2 class Solution:
    3     # s 源字符串
    4     # s.replace 之后原始的字符串并不改变,所以要将s.replace重新赋予一个新变量
    5     def replaceSpace(self, s):
    6         # write code here
    7         s1 = s.replace(' ','%20')
    8         return s1
     1 # -*- coding:utf-8 -*-
     2 class Solution:
     3     # s 源字符串
     4     def replaceSpace(self, s):
     5         # write code here
     6         ls = list(s)
     7         length = len(ls)
     8         for i in range(length):
     9             if ls[i]==' ':
    10                 ls[i] = '%20'
    11         return ''.join(ls)

    c++

    从字符串第一个字符开始往后搜索,一旦遇到空格,那么就先把这个空格之后的所有字符往后移动两位,然后把空格替换,然后继续往后搜索,直到所有空格都替换完毕,我们来算一下时间复杂度,每替换一次空格我们都要将后面所有空格都移动,每一次移动都是O(n),所以移动n次,时间复杂度为O(n^2)。

    传统的思路就会发现​移动次数太多,为啥多呢?一个字符串由多个空格隔成了好多个部分,越靠前的部分需要移动的位数就越小(最小为2,不算第一个部分),越靠后的部分需要移动的位数就越大(2*n),传统思路是从前往后替换的,也就是靠后的部分受制于靠前的部分,所以靠后的部分会移动n次,总体移动次数相当于计算n+(n-1)+.....+2+1,自然是O(n^2).

    那么当务之急就是降低移动次数,我们把从前往后替换变成从后往前替换,如下图:

    那么靠后的部分一下子就移动了2n位,挨个往前,各个部分都不墨迹,直接移动2n位,所以总体移动次数相当于计算1+1+....+1=n,时间复杂度一下子就降到了O(n)。

    我们用两个标记p1和p2,开始分别标记原字符串的末尾和新字符串的末尾,前提是你的原字符串后边的空间是充足的,我把字符数组初始化为100个字符大小,然后随着搜索空格和替换往前移动,下面的图表示的很清晰:

     1 class Solution {
     2 public:
     3     void replaceSpace(char *str,int length) {//字符数组和数组长度(包括'')
     4         if(str==NULL) return;
     5         int count_blank=0;//空格的数目
     6         int origin_length=0;//替换前字符的个数,包括空格,不包括''
     7         int final_length=0;//替换后字符的个数,不包括''
     8         for(int i=0;str[i]!='';i++){
     9             origin_length++;
    10             if(str[i]==' ') count_blank++;
    11         }
    12         final_length=origin_length + 2*count_blank;
    13         //判断字符数组是否越界,因为数组在最初的时候就给定了长度,他不想vector能自动调节长度
    14         if(final_length+1 > length) return ;
    15         //开始替换空格
    16         char* p1 = str + origin_length;//指向原始字符串数组末尾的''
    17         char* p2 = str + final_length;//指向最终字符串数组末尾的''
    18         while(p1!=p2){
    19             if(*p1==' '){
    20                 *p2--='0';//--优先级高于*
    21                 *p2--='2';
    22                 *p2--='%';
    23             }
    24             else{
    25                 *p2--=*p1;
    26             }
    27             p1--;
    28         }
    29     }
    30 };
  • 相关阅读:
    搜狗五笔快捷键
    [原抄] Potplayer 1.7.2710 快捷键
    权限设置并未向在应用程序容器 不可用
    fork( )函数(转载)
    软件开发中的迭代(转载)
    进程间通信的方式(转载)
    P NP NPC(1)(转载)
    P NP NPC(2)(转载)
    大小端字节序
    求n对括号的排列组合(卡特兰数)
  • 原文地址:https://www.cnblogs.com/pacino12134/p/10938964.html
Copyright © 2011-2022 走看看