Skip to content

Latest commit

 

History

History
63 lines (54 loc) · 2.31 KB

day02.md

File metadata and controls

63 lines (54 loc) · 2.31 KB
  • 题目

    • 实现函数
    • 字符串的空格替换成 %20
  • c++字符串:末尾 \0 字符

  • 方法一:时间复杂度较高

    • 向后扫描
    • 发现空格后,在空格之后的所有字符整体后移两位,填入%20
    • 直到遍历结束
  • 分析

    • 假设字符串长度为n
    • 对每个空格,要后移O(n)个字符
    • 对含有O(n)空格的字符串
    • 总效率就是O(n^2)
  • 这种方法一定不是面试官想要的好方法

  • 方法二:时间复杂度为O(n)的解法

    • 先遍历一次字符串,计算出替换后的长度
    • 这两个指针,p1指向当前末尾,p2指向修改后的末尾
    • p1的内容复制到p2处,直到p1遇到空格
    • 在p2处加入0/2/%,p1,p2同时都前进一格
    • 重复上面的步骤
    • 直到p1,p2指向同一个地方,就结束了
  • 代码分析

    • 传入的两个值,字符串和长度容量都不能为空
    • 定义三个变量,原始数组长度,空格的数目,数组索引i
    • 进入while循环,只要没到结束符,原始数组长度++,遇到空格,空格数目++
    • 定义p2指针所需要指向的位置,也就是新的数组长度
    • 如果新的数组长度>给定的数组容量 返回空
    • 进入while,原始长度是>0的,新的长度>旧的数组长度,那么就进入循环
    • p1遇到空格的时候,p2的位置放入0/2/%,然后向前一格
    • p1遇到不是空格的时候,p2复制p1的数据,然后向前
    • p1判断完两种情况后也向前
    • 直到new和origial指向同一个位置,循环条件破坏了,就结束了
def replaceSpace3(self, s):
        if not isinstance(s,str) or len(s) <= 0 or s == None:
            return ""
        spaceNum = 0
        for i in s:
            if i == " ":
                spaceNum += 1

        newStrLen = len(s) + spaceNum * 2
        newStr = newStrLen * [None]
        indexOfOriginal, indexOfNew = len(s) - 1, newStrLen - 1
        while indexOfNew >= 0 and indexOfNew >= indexOfOriginal:
            if s[indexOfOriginal] == ' ':
                newStr[indexOfNew-2:indexOfNew+1] = ['%', '2', '0']
                indexOfNew -= 3
                indexOfOriginal -= 1
            else:
                newStr[indexOfNew] = s[indexOfOriginal]
                indexOfNew -= 1
                indexOfOriginal -= 1
        return "".join(newStr)