前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >程序员进阶之算法练习(一)

程序员进阶之算法练习(一)

作者头像
Scott_Mr
发布2018-07-05 15:26:41
6080
发布2018-07-05 15:26:41
举报
文章被收录于专栏:Scott_Mr 个人专栏

前言

可能很多移动端编程的同学听到算法就感到恐惧,认为我不会算法也能开发呀。确实,不会算法,也能应对一般的工作。但是和大牛之间的差距就是,可能别人3行代码实现的东西,你却要写10多行,并且性能比别人差。那么,让我们来学习一些算法吧。

算法学习

算法的学习最简单的方式就是多练习,找一个提供算法练习的网站,思考,编码,验证,最后再看看别人的思路。 本系列的题目来自LeetCode。IDE采用的Xcode,笔者使用的是swift

(ps:以下练习中代码实现部分并不是唯一解答方法,仅供参考)

Two Sum

题目链接 题目大意:给定一个整数数组,找出满足两个数字相加 等于 目标数的两个数字的索引,并且返回。 例如:

nums = [2, 7, 11, 15], target = 9 , 因为 nums[0] + nums[1] = target, 所以 return [0, 1]

代码实现:

代码语言:javascript
复制
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

代码实现:

代码语言:javascript
复制
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;

代码实现:

代码语言:javascript
复制
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. 没有重复的字符;

致谢

如果发现有错误的地方,欢迎各位指出,谢谢!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-08-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 算法学习
  • Two Sum
  • Add Two Numbers
  • Longest Substring Without Repeating Characters
  • 致谢
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档