可能很多移動端程式設計的同學聽到演算法就感到恐懼,認為我不會演算法也能開發呀。確實,不會演算法,也能應對一般的工作。但是和大牛之間的差距就是,可能別人3行**實現的東西,你卻要寫10多行,並且效能比別人差。那麼,讓我們來學習一些演算法吧。
演算法的學習最簡單的方式就是多練習,找乙個提供演算法練習的**,思考,編碼,驗證,最後再看看別人的思路。
本系列的題目來自leetcode。ide採用的xcode
,筆者使用的是swift
。
(ps:以下練習中**實現部分並不是唯一解答方法,僅供參考)
題目鏈結
題目大意:給定乙個整數陣列,找出滿足兩個數字相加 等於 目標數的兩個數字的索引,並且返回。
例如:
nums = [2, 7, 11, 15], target = 9 ,**實現:因為 nums[0] + nums[1] = target,
所以 return [0, 1]
func twosum(_ nums:[int], _ target:int) -> [int]? else
}return nil
}
題目鏈結
題目大意:使用鍊錶實現兩個數字相加
例如:
12 + 13 = 25**實現:
public class listnode
}public class solution
func helper(_ l1:listnode?, _ l2:listnode?, _ carry: int) -> listnode?
if p == nil && q != nil
if p != nil && q == nil
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
var map = [character: int]()
var result = 0
var j = 0
for (i, charactor) in s.characters.enumerated()
map[charactor] = i
result = max(result, i-j+1)
}return result
}
思路:
本題目主要有3個注意點:如果發現有錯誤的地方,歡迎各位指出,謝謝!最長的;
連續的;
沒有重複的字元;
程式設計師演算法練習二
無重複字元的最長子串 給定乙個字串,找出不含有重複字元的最長子串的長度。示例 給定 abcabcbb 沒有重複字元的最長子串是 abc 那麼長度就是3。給定 bbbbb 最長的子串就是 b 長度是1。給定 pwwkew 最長子串是 wke 長度是3。請注意答案必須是乙個子串,pwke 是 子串行 而...
程式設計師演算法練習四
給定乙個 32 位有符號整數,將整數中的數字進行反轉。示例 1 輸入 123 輸出 321 示例 2 輸入 123 輸出 321 示例 3 輸入 120 輸出 21 注意 假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 231,231 1 根據這個假設,如果反轉後的整數溢位,則返回 0。常...
程式設計師怎麼高階
mvc框架了解乙個就可以,不用花更多精力去精通每乙個mvc框架,因為mvc框架太多,學到的只是框架用法,各個框架間用法不通用,時間成本並不划算。php不要光會用,至少要去了解下底層原理,對於寫出來高質量高效能 有一定幫助。最主要socket程式設計 多程序程式設計都要去熟悉一下。這些屬於底層原理,學...