博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
程序员进阶之算法练习(一)
阅读量:5026 次
发布时间:2019-06-12

本文共 2534 字,大约阅读时间需要 8 分钟。

前言

可能很多移动端编程的同学听到算法就感到恐惧,认为我不会算法也能开发呀。确实,不会算法,也能应对一般的工作。但是和大牛之间的差距就是,可能别人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个注意点:

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

致谢

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

转载于:https://www.cnblogs.com/scott-mr/p/7423845.html

你可能感兴趣的文章
iptables 网址转译 (Network address translation,NAT)
查看>>
ios __block typeof 编译错误解决
查看>>
android 插件形式运行未安装apk
查看>>
ios开发之 manage the concurrency with NSOperation
查看>>
Android权限 uses-permission
查看>>
NSEnumerator用法小结
查看>>
vim如何配置go语言环境
查看>>
机器学习好网站
查看>>
python 中的 sys , os 模块用法总结
查看>>
解题:国家集训队 Middle
查看>>
响应者链
查看>>
指针从函数内部带回返回值
查看>>
在使用webView播放flash或视频文件时无法关闭声音的问题
查看>>
redhat 7 源码安装 mysql5.5.49
查看>>
CCP浅谈
查看>>
NAT虚拟网络配置
查看>>
c#部分---需要实例化的内容;
查看>>
销售类
查看>>
技术项目,问题
查看>>
线程池总结
查看>>