程序員進階之算法練習(一)

前言

可能不少移動端編程的同窗聽到算法就感到恐懼,認爲我不會算法也能開發呀。確實,不會算法,也能應對通常的工做。可是和大牛之間的差距就是,可能別人3行代碼實現的東西,你卻要寫10多行,而且性能比別人差。那麼,讓咱們來學習一些算法吧。算法

算法學習

算法的學習最簡單的方式就是多練習,找一個提供算法練習的網站,思考,編碼,驗證,最後再看看別人的思路。
本系列的題目來自LeetCode。IDE採用的Xcode,筆者使用的是swift編程

(ps:如下練習中代碼實現部分並非惟一解答方法,僅供參考)swift

Two Sum

題目連接
題目大意:給定一個整數數組,找出知足兩個數字相加 等於 目標數的兩個數字的索引,而且返回。
例如:數組

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
}

Add Two Numbers

題目連接
題目大意:使用鏈表實現兩個數字相加網站

例如:編碼

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個要點:

  • 所有爲nil時,返回進位值;
  • 有一個爲nil時,返回不爲nil的那個ListNode和進位值相加的結果;
  • 都不爲nil時,返回兩個ListNode和進位值相加的結果。

Longest Substring Without Repeating Characters

題目連接

題目大意:給定一個字符串,找出其中最長的沒有出現重複字符的連續子串的長度。
例如:

"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個注意點:

  1. 最長的;
  2. 連續的;
  3. 沒有重複的字符;

致謝

若是發現有錯誤的地方,歡迎各位指出,謝謝!

相關文章
相關標籤/搜索