李洪强iOS经典面试题34-求两个链表表示的数的和
李洪强iOS经典面试题34-求两个链表表示的数的和
问题
给你两个链表,分别表示两个非负的整数。每个链表的节点表示一个整数位。
为了方便计算,整数的低位在链表头,例如:123 在链表中的表示方式是:
3 -> 2 -> 1
现在给你两个这样结构的链表,请输出它们求和之后的结果。例如:
输入: (2 -> 4 -> 1) + (5 -> 6 -> 1)
输出: 7 -> 0 -> 3
代码模版
本题的 Swift 代码模版如下:
private class ListNode {
public var val: Int
public var next: ListNode?
public init(_ val: Int) {
self.val = val
self.next = nil
}
}
class Solution {
func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?)
-> ListNode? {
}
}
考查点
本题出自 LeetCode 上的第 2 题。
这是我高中学习编程时最早接触的一类题目,我们把这类题目叫做「高精度计算」,其实就是在计算机计算精度不够时,模拟我们在纸上演算的方式来计算答案,然后获得足够精度的解。
我还记得我 7 年前第一次去网易有道面试的时候,就考查的是一道类似的高精度计算题目,比这道题复杂得多,我当时用了一个比较笨的办法,加上当时还是用 C++ 写的,内存分配和释放写起来也比较麻烦,最后写了两页 A4 纸才写完。
这道题其实完全不考查什么「算法」,人人都知道怎么计算,但是它考察了「将想法转换成代码」的能力,新手通常犯的毛病就是:意思都明白,但是写不出来代码。所以,这类题目用来过滤菜鸟确实是挺有效的办法。
答案
本题的做法其实没什么特别,就是直接计算。计算的时候需要考虑到以下这些情况:
两个整数长度不一致的情况。
进位的情况。当进位产生时,我们需要保存一个标志位,以便在计算下一位的和的时候,加上进位。
当计算完后,如果还有进位,需要处理最后结果加一位的情况。
以下是完整的代码,我使用了一些 Swift 语言的特性,比如用 flatMap 来减少对于 Optional类型值为 nil 的判断。
private class ListNode {
public var val: Int
public var next: ListNode?
public init(_ val: Int) {
self.val = val
self.next = nil
}
}
private class Solution {
private func getNodeValue(_ node: ListNode?) -> Int {
return node.flatMap { $0.val } ?? 0
}
func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?)
-> ListNode? {
if l1 == nil || l2 == nil {
return l1 ?? l2
}
var p1 = l1
var p2 = l2
let result: ListNode? = ListNode(0)
var current = result
var extra = 0
while p1 != nil || p2 != nil || extra != 0 {
var tot = getNodeValue(p1) +
getNodeValue(p2) + extra
extra = tot / 10
tot = tot % 10
let sum:ListNode? = ListNode(tot)
current!.next = sum
current = sum
p1 = p1.flatMap { $0.next }
p2 = p2.flatMap { $0.next }
}
return result!.next
}
}
以上代码也可以从我的 Gist 中找到:https://gist.github.com/tangqiaoboy/af0dc9a45dd309e91436b44b76eab5f1
偷偷告诉你一个小秘密,Gist 里面的代码我稍微修改了两行,最终性能就从打败 LeetCode 10% 的提交变成了打败 LeetCode 50% 的提交,如果你感兴趣,可以自己仔细对比一下。
愿大家玩得开心~
李洪强iOS经典面试题34-求两个链表表示的数的和的更多相关文章
- 李洪强iOS经典面试题144-数据存储
李洪强iOS经典面试题144-数据存储 数据存储 sqlite中插入特殊字符的方法和接收到处理方法. 除'其他的都是在特殊字符前面加"/",而 ' -> '' .方法:k ...
- 李洪强iOS经典面试题下
李洪强iOS经典面试题下 21. 下面的代码输出什么? @implementation Son : Father - (id)init { self = [super init]; if (self) ...
- 李洪强iOS经典面试题156 - Runtime详解(面试必备)
李洪强iOS经典面试题156 - Runtime详解(面试必备) 一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...
- 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)
李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...
- 李洪强iOS经典面试题154- 通知与推送
李洪强iOS经典面试题154- 通知与推送 通知与推送 本地通知和远程推送通知对基本概念和用法? image 本地通知和远程推送通知都可以向不在前台运行的应用发送消息,这种消息既可能是即将发生的事 ...
- 李洪强iOS经典面试题153- 补充
李洪强iOS经典面试题153- 补充 补充 有空就来解决几个问题,已经懒癌晚期没救了... UML 统一建模语言(UML,UnifiedModelingLanguage)是面向对象软件的标准化建模 ...
- 李洪强iOS经典面试题147-WebView与JS交互
李洪强iOS经典面试题147-WebView与JS交互 WebView与JS交互 iOS中调用HTML 1. 加载网页 NSURL *url = [[NSBundle mainBundle] UR ...
- 李洪强iOS经典面试题143-绘图与动画
李洪强iOS经典面试题143-绘图与动画 绘图与动画 CAAnimation的层级结构 CAPropertyAnimation是CAAnimation的子类,也是个抽象类,要想创建动画对象,应该使 ...
- 李洪强iOS经典面试题142-第三方框架及其管理
李洪强iOS经典面试题142-第三方框架及其管理 第三方框架及其管理 使用过CocoaPods吗?它是什么?CocoaPods的原理? CocoaPod是一个第三方库的管理工具,用来管理项目中的第 ...
- 李洪强iOS经典面试题141-报错警告调试
李洪强iOS经典面试题141-报错警告调试 报错警告调试 你在实际开发中,有哪些手机架构与性能调试经验 刚接手公司的旧项目时,模块特别多,而且几乎所有的代码都写在控制器里面,比如UI控件代码.网络 ...
随机推荐
- 世界围棋人机大战、顶峰对决第一盘:围棋世界冠军Lee Sedol(李世石,围棋职业九段)对战Google DeepMind AlphaGo围棋程序
Match 1 - Google DeepMind Challenge Match: Lee Sedol vs AlphaGo 很多网站对世界围棋大战进行了现场直播,比如YouTube.新浪.乐视.腾 ...
- Linux内核的idle进程分析
1. idle是什么 简单的说idle是一个进程,其pid号为 0.其前身是系统创建的第一个进程.也是唯一一个没有通过fork()产生的进程. 在smp系统中,每一个处理器单元有独立的一个执行队列,而 ...
- Echarts使用dataset数据集管理数据
1.可以看官网api的入门例子 使用常见的对象数组的格式 option = { legend: {}, tooltip: {}, dataset: { // 这里指定了维度名的顺序,从而可以利用默认的 ...
- FrameWork数据权限浅析4之基于多维度配置表实现行级数据安全
日子过得好苦逼,我过的很好,只是缺少¥.时间在变,而问题始终未变,你解不解决它都在那里一动不动.不知不觉已经发现手机的中央,电脑的右下角已经出现了201411的字样,突然从桌子上爬起来,差点忘记了自己 ...
- win8.1安装开发工具 vs2015 Visual Studio 2015 Preview Downloads
1.首先全新安装win8.1 略 破解激活.... 2.安装Visual Studio 2015 Visual Studio 2015 是免费的,不存在破解版本, 如果安装过程中存在问题,建议先把本文 ...
- css换行缩进
1.换行缩进 <div id="alertiframe"> <span id="closeiframe">×</span> ...
- android中可以使用bitmap的平铺,镜像平铺等减小图片带来的apk过大的问题
bitmap的平铺.镜像drawable文件夹中新建bitmap,其中的tileMode属性 tileMode 属性就是用于定义背景的显示模式: disabled 默认值,表示不使用平铺 cla ...
- “建议127:Lock与synchronized是不一样的问题”实际验证
近期又一次翻看 "编写高质量代码:改善Java程序的151个建议" 一书的时候看到"建议127"的文章中作者提供的測试用例存在一些值得商榷的地方. 在使 ...
- 虚拟机chrome os 没有可用网络错误
从http://chromeos.hexxeh.net/ 下载了一个chrome os的VM版本的,在VM9上打开运行,一直提示没有可用网络 解决方案 查看虚拟机的网络设置设置为 NAT方式 查看主机 ...
- 【PAT】1028. List Sorting (25)
题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1028 题目描述: Excel can sort records according to an ...