zoukankan      html  css  js  c++  java
  • 替换空格(Python and C++解法)

    题目:

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

    思路:

      pyhon中有很多非常方便的替换操作,如:

    1 return s.replace(' ', '%20')  # 直接replace替换就行
    1 s = s.split(" ")
    2 return "%20".join(s)
    1 strLen = len(s)
    2 newStr = []
    3 for i in range(strLen):
    4     if s[i] == " ":
    5         newStr.append("%20")
    6     else:
    7         newStr.append(s[i])
    8 return ''.join(newStr)  # ''.join()表示什么也不添加;如果没有该句,则返回的是一个列表        

    上述解法操作上很方便,但是涉及到了大量的字符重复搬移工作,且严格来说,题目需要自己实现一个函数实现该替换功能。

    如果想降低复杂度,需要将所有的字符搬运次数降低为1次,时间复杂度变为O(n)。

    方法是:先统计源字符串的长度L1和空格个数K,那么替换20%之后的新字符串长度L2 = L1 + 2*K。然后使用两个指针,一个P1指向源字符串的末尾,一个P2指向新字符串的末尾,逐个复制P1指向的字符给P2,直到P1遇到第一个空格,此时P1往前移一位,P2移动3位,插入20%。重复上述过程,直到两个指针相遇,代表空格已经插完。

    Python解法:

     1 class Solution:
     2     def replaceSpace(self, s):
     3         s_len = len(s)  # 源字符串长度
     4         n_space = 0  # 空格计数
     5         if s is None or s_len == 0:
     6             return ""
     7 
     8         for i in range(s_len):  # 统计空格数量
     9             if s[i] == ' ':
    10                 n_space += 1
    11         s_new_len = s_len + 2 * n_space  # 新串的长度
    12 
    13         if s_new_len == s_len:  # 如果没有空格,直接返回源串
    14             return s
    15         s_new = [0] * s_new_len  # 新串
    16 
    17         while s_len >= 0 and s_new_len >= s_len:
    18             if s[s_len-1] != ' ':
    19                 s_new[s_new_len - 1] = s[s_len - 1]
    20                 s_new_len -= 1
    21                 s_len -= 1
    22             else:
    23                 s_len -= 1
    24                 s_new[s_new_len-1] = '0'
    25                 s_new_len -= 1
    26                 s_new[s_new_len-1] = '2'
    27                 s_new_len -= 1
    28                 s_new[s_new_len-1] = '%'
    29                 s_new_len -= 1
    30         return ''.join(s_new)

    C++解法:

     1 class Solution {
     2 public:
     3     void replaceSpace(char *str, int length) {
     4         if (str == NULL || length == 0)
     5             return;
     6         int spaceCount = 0;  //  统计空格
     7         int index = 0;  // 由于不知所给的length识别包含'',所以实际统计一下字符
     8         while (str[index] != '') {
     9             if(str[index] == ' ')
    10                 spaceCount += 1;
    11             ++index;
    12         }
    13         int oriLentg = index, newLength = oriLentg + 2 * spaceCount;
    14         
    15         if(spaceCount == 0)
    16             return;
    17 
    18         while (oriLentg >= 0 && newLength >= oriLentg) {
    19             if (str[oriLentg] != ' ') {
    20                 str[newLength] = str[oriLentg];
    21                 oriLentg -= 1;
    22                 newLength -= 1;
    23             }
    24             else {
    25                 oriLentg -= 1;
    26                 str[newLength--] = '0';
    27                 str[newLength--] = '2';
    28                 str[newLength--] = '%';
    29             }
    30         }
    31         return;
    32     }
    33 };
  • 相关阅读:
    Ubuntu 16.04远程登录服务器--ssh的安装和配置
    设置淘宝源
    shell 循环 read line
    apt-get update 报错 W: Unknown Multi-Arch type 'no' for package 'compiz-core'
    expdp dblink
    ubuntu apt-update NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6ACC0B21F32
    listener.log文件过大导致oracle假死
    rsync_ssh
    ssh多主机
    elk大纲
  • 原文地址:https://www.cnblogs.com/kongzimengzixiaozhuzi/p/13169437.html
Copyright © 2011-2022 走看看