程序员进阶之算法练习
Posted 于继海
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序员进阶之算法练习相关的知识,希望对你有一定的参考价值。
前言
可能很多移动端编程的同学听到算法就感到恐惧,认为我不会算法也能开发呀。确实,不会算法,也能应对一般的工作。但是和大牛之间的差距就是,可能别人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个注意点:
- 最长的;
- 连续的;
- 没有重复的字符;
致谢
如果发现有错误的地方,欢迎各位指出,谢谢!
以上是关于程序员进阶之算法练习的主要内容,如果未能解决你的问题,请参考以下文章
我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情
我的OpenGL学习进阶之旅NDK开发中find_library查找的系统动态库在哪里?