今天看到一道簡單的算法題
字符串的左旋轉操作是把字符串前面的若干個字符轉移到字符串的尾部
例如: s = "asdfghj" n = 2 返回: dfghjas
并且限制 1 <= n < s.length <= 10000
例子
輸入: s = "abcdefg", k = 2
返回: "cdefgab"
輸入: s = "lrloseumgh", k = 6
返回: "umghlrlose"
解題思路
這道算法題相對簡單
因為已經(jīng)給定限制 對于數(shù)字k, 數(shù)組s 有
1 <= k < s.length <= 10000
這個限制條件至少能幫我們剩下1行代碼 :)
方法1:
字符串剪切, 再拼接
swift 有個比較簡潔方法 [startIndex..<endIndex]
我們利用這個方法來處理這題
簡潔高效2行代碼處理
func reverseLeftWords(_ s: String, _ n: Int) -> String {
let mid = s.index(s.startIndex, offsetBy: n)
return String(s[mid..<s.endIndex] + s[s.startIndex..<mid])
}
這種方法時間復雜度, 空間復雜度 都很小
方法2:
也是字符串剪切, 再拼接
這里我們用到swift 更簡潔的兩個方法
dropFirst、prefix
dropFirst(n): 返回一個子序列,該子序列包含除給定數(shù)量的初始元素外的所有元素。超過返回空數(shù)組
例如: let array = [1, 2, 3, 4]
print(array.dropFirst())//輸出[2,3,4]
print(array.dropFirst(2))//輸出[3,4]
針對于數(shù)字數(shù)組時間復雜度 O(1)
prefix(n): 從集合的初始元素開始, 返回一個子序列,最大長度為指定的最大長度。超過返回所有元素
例如: let array = [1, 2, 3, 4]
print(array.prefix(2))//輸出[1,2]
print(array.prefix(10))//輸出[1,2,3,4]
針對于數(shù)字數(shù)組時間復雜度 O(1)
這樣我們一行代碼就可以寫出
func reverseLeftWords(_ s: String, _ n: Int) -> String {
return String(s.dropFirst(n)) + String(s.prefix(n))
}
題目來源:力扣(LeetCode) 感謝力扣爸爸 :)