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

前言

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

致谢

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

时间: 2024-12-09 17:51:53

程序员进阶之算法练习(一)的相关文章

程序员进阶之算法练习:LeetCode专场

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由落影发表 前言 LeetCode上的题目是大公司面试常见的算法题,今天的目标是拿下5道算法题: 题目1是基于链表的大数加法,既考察基本数据结构的了解,又考察在处理加法过程中的边界处理: 题目2是求数组出现频率前k大的数字,考察思维能力,代码很短: 题目3是给出从两个数组中选择数字,组成一个最大的数字,考察的是贪心的思想: 前三个都偏向于考察想法,实现的代码都比较简单: 题目4.5是数据结构实现题,也是大部分人比较头疼的题目,因为需

程序员进阶书籍

C/C++推荐书籍:C++程序设计语言                 Bjarne Stroustrup(入门书籍熟读一本即可)C++ Primer(第四版)            Stanley B.Lippman, Josee Lajoie    (用于查阅)C++编程规范:101 条规则.准则与最佳实践         HerbSutter, Andrei Alexandrescu  2006 (More) Exceptional C++      HerbSutter     2006

程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大系列集锦

程序员面试.算法研究.编程艺术.红黑树.数据挖掘5大系列集锦

程序员进阶学习书籍

一年复一年,两年前的今天刚从指导老师手中接过毕业证书,仿佛就发生在昨天.多希望这一切不要走得太快,即使未来总会都许多新鲜的实物替代. 回顾这一年,也想不出学了什么,但感觉改过的BUG肯定不少.对于我种几乎没有什么天赋的程序员,成长还是挺艰难的,我能保证的就是不懂得东西多查阅资料.下面这个来自 csdn的程序员进阶书单我还是很喜欢的,分享给大家: 基础知识入门 <PHP与MySQL程序设计(第4版)> <深入浅出MySQL 数据库开发 优化与管理维护 第2版> <实战Nginx

【原创】PHP程序员进阶学习书籍参考指南

PHP程序员进阶学习书籍参考指南 @heiyeluren lastmodify: 2016/2/18 [初阶](基础知识及入门) 01. <PHP与MySQL程序设计(第4版)>  http://item.jd.com/10701892.html 02. <深入浅出MySQL 数据库开发 优化与管理维护 第2版> http://item.jd.com/11381295.html 03. <实战Nginx:取代Apache的高性能Web服务器> http://dwz.cn

程序员初学机器学习算法

英文原文:4 Self-Study Machine Learning Projects 学习机器学习有很多方法,大多数人选择从理论开始. 如果你是个程序员,那么你已经掌握了把问题拆分成相应组成部分及设计小项目原型的能力,这些能力能帮助你学习新的技术.类库和方法.这些对任何一个职业程序员来说都是重要的能力,现在它们也能用在初学机器学习上. 要想有效地学习机器学习你必须学习相关理论,但是你可以利用你的兴趣及对知识的渴望,来激励你从实际例子学起,然后再步入对算法的数学理解. 通过本文你可以学习到程序员

【同行说技术】Java程序员进阶资料汇总(二)

在文章<Java程序员学习资料汇总(一)>里面向大家传送了一些Java入门学习的基础,今天小编继续发功,整理了5篇Java的进阶资料,快来看看吧! 一.开发高性能 Java app 需要知道的那些事 深入剖析了Java APP开发的效率和性能优化问题,值得一览 二.Top 50个快速高效学习 Java 的在线资源 这篇文章提供了快速高效学习 Java 编程的 50 多个网站资源,值得收藏一下 三.推荐普通开发者学习使用的6个JDK内建工具 作者挑了几个 Hotspot 标准安装后可用的小工具来

黑马程序员——数据结构排序算法总结

-----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 下面是几个网上常见的总结图: 有些不同之处:集中在希尔排序的时间复杂度.快速归并的空间复杂度上 个人总结口诀: 选择N方-->选择排序的最好最坏平均都N方 插入冒泡最好N-->插入冒泡的最好是N,其他是N方 归并堆n乘logN-->归并希尔堆的最好最坏平均都是n乘logN 快速最坏N方-->快速排序的最坏是N方,其他是n乘logN 快速选择希尔堆不稳定-->

【软帝学院】七点java程序员进阶必备技能

程序员进阶很慢?七点java程序员进阶必备技能,让你少走弯路 一.架构师筑基必备技能 阿里面试更多的内容是架构师基础内容,比如并发编程的AQS.CAS等,多纬度提升架构基础,并发编程高级进阶,JVM性能深度调优,网络编程与高效IO,深入Tomcat底层,Mysql深度优化实战,架构师必备Linux 二.分布式方案及团队协作工具 分布式环境下应该知道的分布式系列问题: 分布式事物解决方案 单点登录解决方案 分布式任务调试解决方案 Maven企业级实战 Jenkins分布式构建实战 Git版本管理