可能不少移動端編程的同窗聽到算法就感到恐懼,認爲我不會算法也能開發呀。確實,不會算法,也能應對通常的工做。可是和大牛之間的差距就是,可能別人3行代碼實現的東西,你卻要寫10多行,而且性能比別人差。那麼,讓咱們來學習一些算法吧。算法
算法的學習最簡單的方式就是多練習,找一個提供算法練習的網站,思考,編碼,驗證,最後再看看別人的思路。
本系列的題目來自LeetCode。IDE採用的Xcode
,筆者使用的是swift
。編程
(ps:如下練習中代碼實現部分並非惟一解答方法,僅供參考)swift
題目連接
題目大意:給定一個整數數組,找出知足兩個數字相加 等於 目標數的兩個數字的索引,而且返回。
例如:數組
nums = [2, 7, 11, 15], target = 9 ,
由於 nums[0] + nums[1] = target,
因此 return [0, 1]性能
代碼實現:學習
func twoSum(_ nums:[Int], _ target:Int) -> [Int]? { var d = [Int: Int]() for (i, num) in nums.enumerated(){ if let sum = d[target - num] { return [sum, i] }else{ d[num] = i } } return nil }
題目連接
題目大意:使用鏈表實現兩個數字相加網站
例如:編碼
12 + 13 = 25code
代碼實現:索引
public class ListNode { public var val: Int public var next: ListNode? public init(_ val: Int) { self.val = val self.next = nil } } public class Solution { func addTwoNumbers(_ l1:ListNode?, _ l2:ListNode?) -> ListNode? { return helper(l1, l2, 0) } func helper(_ l1:ListNode?, _ l2:ListNode?, _ carry: Int) -> ListNode? { var p = l1 var q = l2 if p == nil && q == nil { return carry == 0 ? nil: ListNode(carry) } if p == nil && q != nil { p = ListNode(0) } if p != nil && q == nil { q = ListNode(0) } let sum = (p?.val)! + (q?.val)! + carry let curr = ListNode(sum % 10) curr.next = helper(p?.next, q?.next, sum/10) return curr } } var l1:ListNode? var l2:ListNode? l1 = ListNode(12) l2 = ListNode(13) let s = Solution() let result1 = s.addTwoNumbers(l1, l2)
思路:
按照小學加法原理,從末尾對齊相加,滿十進位。技巧在於如何處理不一樣長度的兩個數字,以及進位和最高位的判斷。這裏對於不一樣長度的數字,咱們經過在較短的數字前面添加零來保證每一位都能相加。主要分爲如下3個要點:
題目大意:給定一個字符串,找出其中最長的沒有出現重複字符的連續子串的長度。
例如:
"abcabcbb" 最長的不重複字符子串是"abc",長度爲3;
"bbbbb" 最長的不重複字符子串是"b",長度爲1;
"pwwkew" 最長的不重複字符子串是"wke",長度爲3;
代碼實現:
func lengthOfLongestSubstring(_ s:String) -> Int { if s.isEmpty { return 0 } var map = [Character: Int]() var result = 0 var j = 0 for (i, charactor) in s.characters.enumerated() { if map.keys.contains(charactor) { j = max(j, map[charactor]! + 1) } map[charactor] = i result = max(result, i-j+1) } return result }
思路:
本題目主要有3個注意點:
- 最長的;
- 連續的;
- 沒有重複的字符;
若是發現有錯誤的地方,歡迎各位指出,謝謝!