前言
可能很多移动端编程的同学听到算法就感到恐惧,认为我不会算法也能开发呀。确实,不会算法,也能应对一般的工作。但是和大牛之间的差距就是,可能别人3行代码实现的东西,你却要写10多行,并且性能比别人差。那么,让我们来学习一些算法吧。
算法学习
算法的学习最简单的方式就是多练习,找一个提供算法练习的网站,思考,编码,验证,最后再看看别人的思路。
本系列的题目来自。IDE采用的Xcode
,笔者使用的是swift
。 (ps:以下练习中代码实现部分并不是唯一解答方法,仅供参考)
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 = 25
代码实现:
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个注意点:
- 最长的;
- 连续的;
- 没有重复的字符;
致谢
如果发现有错误的地方,欢迎各位指出,谢谢!