請實現(xiàn)一個函數(shù)枷恕,將一個字符串中的空格替換成“%20”递览。
/** Swift
* 問題:請實現(xiàn)一個函數(shù),將一個字符串中的空格替換成“%20”檩淋。
* 例如,當字符串為We Are Happy.則經(jīng)過替換之后的字符串為We%20Are%20Happy
*
* 思路:方法一: 使用系統(tǒng)的替換方法,需要系統(tǒng)庫 Foundation
* 方法二: 遍歷字符串的每一個字符描沟,然后放入一個新的字符串中。這樣做開辟了新的內(nèi)存空間
* 方法三: C 語言沒有特定的字符串類型鞭光,str[]吏廉,所以可以通過往原先數(shù)組中替換插入的方式。Swift 中惰许,雖然 String
* 也是字符串的集合席覆,但是作為對象不能直接修改其內(nèi)部元素,所以此處僅作為演示啡省,重在思想娜睛。
*
*/
// 方法一
import Foundation
func replaceBlankWithSystemFunction(in aString: String) -> String {
let aChar: String = "%20"
// associated Foundation
return aString.replacingOccurrences(of: " ", with: aChar, options: .literal, range: nil)
}
// 方法二
func replaceBlankWithANewString(in aString: String) -> String {
let aChar: String = "%20"
var newString = ""
for i in aString.enumerated() {
if i.element == " " {
newString.append(String(aChar))
} else {
newString.append(String(i.element))
}
}
return newString
}
// 方法三
func replaceBlank(in aString: String, length: Int) -> String {
var blankCount = 0 // 空格數(shù)量
for char in aString.enumerated() {
if char.element == " " {
blankCount += 1
}
}
if blankCount == 0 { return aString } // 無空格直接返回原數(shù)據(jù)
let targetLength = aString.count + 2 * blankCount // 轉(zhuǎn)化后長度增長 空格*2
var l = length - 1 // 原始最后下標
var t = targetLength - 1 // 目標最后下標
var chars = Array<Character>(repeating: "_", count: targetLength) // 新建一個大小為 targeLength 大小的字符數(shù)組, PS: C 語言不需要新建,可以直接操作字符數(shù)組
var moveCount: Int = 0
while l >= 0 { // 遍歷 l卦睹,依次填充數(shù)據(jù)大小為 t 的數(shù)組
let start = aString.index(aString.startIndex, offsetBy: l)
let end = aString.index(aString.startIndex, offsetBy: l + 1)
let char = Character(String(aString[start..<end])) // 取到字符
if char == " " { // 檢查每個原始數(shù)據(jù)位置是否為空
chars[t-2...t] = ["%", "2","0"]
t -= 2
} else { // 否則移動字符畦戒。從前往后插入每插入一次都要移動之后的所有字符, O(log n),而從后往前插入结序,以為已經(jīng)知道了目標數(shù)組大小障斋,所以只需要移動當前字符即可 O(n)。
chars[t] = char
moveCount += 1
}
l -= 1
t -= 1
}
debugPrint(moveCount)
return String(chars)
}
// MARK: - Test
let aString = "I Love You"
let a = replaceBlank(in: aString, length: aString.count)
github 請查看這里