专栏首页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]

代码实现:

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个注意点:

  1. 最长的;
  2. 连续的;
  3. 没有重复的字符;

致谢

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    Scott_Mr
  • 两个App之间调起通信

    Scott_Mr
  • 两个App之间调起通信

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

    Scott_Mr
  • JSON Web Token 的结构是什么

    JSON Web Tokens 由使用 (.) 分开的 3 个部分组成的,这 3 个部分分别是:

    HoneyMoose
  • ERP研究:行为抑制与青少年社交焦虑间的神经行为机制

    目的:行为抑制(behavioral inhibition ,BI)是儿童早期发现的一种气质,是导致后面社交焦虑的危险因素之一。然而,社交焦虑的发展机制仍不清楚...

    用户1279583
  • 金融科技&大数据产品推荐:票据贷——到期银行承兑,安全稳健之选

    官网 | www.datayuan.cn 微信公众号ID | datayuancn 本产品为数据猿推出的“金融科技价值—数据驱动金融商业裂变”大型主题策划活动第...

    数据猿
  • springboot配置之配置文件的加载顺序

    springboot启动时会扫描一下位置的application.properties或者application.yml文件作为默认配置文件:

    绝命生
  • 2020年《财富》世界500强企业分析报告

    《财富》杂志发布《2020年财富世界500强排行榜》,从国家及地区分布来看,中国上榜企业达到133家,美国上榜企业121家,欧盟上榜企业95家,日本上榜企业53...

    用户6278626
  • 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)

    今天没有延续上一篇讲的内容,穿插一段小插曲,WebSocket 实时数据通讯同步的问题,今天我们并不是很纯粹地讲 WebSocket 相关知识,我们通过 Web...

    HT for Web

扫码关注云+社区

领取腾讯云代金券