zoukankan      html  css  js  c++  java
  • 程序员进阶之算法练习(一)

    前言

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

    致谢

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

  • 相关阅读:
    Java 水仙花数
    Java 手机短号
    Java发工资
    VMware安装Linux CentOS7
    (转载)MongoDB的学习--explain()和hint()
    Linux基本操作练习题整理
    Linux的安装配置及常用命令(二)
    Linux的安装配置及常用命令(一)
    java中Json的使用
    Ajax
  • 原文地址:https://www.cnblogs.com/yujihaia/p/7425852.html
Copyright © 2011-2022 走看看