Problem: 面试题 01.03. URL化
思路
整体来说,有两个大路线。
题目提示的“从后往前修改字符串”是路线一。
自然就用从头往后遍历字符串是路线二。
解题方法
路线一
就是双指针i, j,从后往前一边遍历一边修改。
题目说明了字符串S有足够的空间来支持修改,才能这么做。
不然就得另外起一个字符串重新写。
具体代码详见写法3
路线二
就是另外起一个string重新写。
从头往后遍历,在另外一个字符串跟着写。
具体代码详见写法1与写法2
复杂度
时间复杂度: 路线一 n为字符串长度 路线二 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. 重新排列字符串
思路
直接按照题目的意思模拟就好。
解题方法
直接按照题目的意思模拟就好。
复杂度
时间复杂度: ,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)
}