茶艺师学算法打卡9: 算法题打卡

92 阅读2分钟

Problem: 面试题 01.03. URL化

思路

整体来说,有两个大路线。
题目提示的“从后往前修改字符串”是路线一。
自然就用从头往后遍历字符串是路线二。

解题方法

路线一

就是双指针i, j,从后往前一边遍历一边修改。
题目说明了字符串S有足够的空间来支持修改,才能这么做。
不然就得另外起一个字符串重新写。
具体代码详见写法3

路线二

就是另外起一个string重新写。
从头往后遍历,在另外一个字符串跟着写。 具体代码详见写法1与写法2

复杂度

时间复杂度: 路线一 O(n)O(n) n为字符串长度 路线二 O(n)O(n) n为字符串长度

空间复杂度: 路线一 O(1)O(1) 因为就是原地(字符串)修改 路线二 O(n)O(n) n为字符串长度

Code

// 写法1
import "strings"

func replaceSpaces(S string, length int) string {
    var res strings.Builder 
    for i := 0; i < len(S); {
        if i == length {
            break
        }

        if string(S[i]) == string(" ") {
            res.WriteString("%20")
            i++
        } else {
            res.WriteByte(byte(S[i]))
            i++
        }
    }

    return res.String() 
}
// 写法2
import "strings"

func replaceSpaces(S string, length int) string {
    cnt := strings.Count(S, " ")
    times := length - (len(S) - cnt)
    res := strings.Replace(S, " ", "%20", times)
    return res[:(length + times * 2)]
}
// 写法3
func replaceSpaces(S string, length int) string {
    res := []byte(S)
    i, j := length - 1, len(S) - 1 
    for ; i >= 0; {
        if res[i] == ' ' {
            res[j] = '0'
            res[j - 1] = '2'
            res[j - 2] = '%'
            j -= 3
        } else {
            res[j] = res[i]
            j--
        }
        i--
    }
    return string(res[j + 1:])
}

Problem: 1528. 重新排列字符串

思路

直接按照题目的意思模拟就好。

解题方法

直接按照题目的意思模拟就好。

复杂度

时间复杂度: O(n)O(n),n为字符串长度

空间复杂度: O(n)O(n),n为字符串长度

Code

func restoreString(s string, indices []int) string {
    res := make([]byte, len(s))
    for i := 0; i < len(s); i++ {
        res[indices[i]] = byte(s[i])
    }
    return string(res)
}