流下了不学无术的泪水:今天你刷题了吗(二)
点击上方“程序人生”,选择“置顶公众号”
第一时间关注程序猿(媛)身边的故事
《今天你刷题了吗(?)》是小班克发起的一场做算法题的活动,该活动会尽量保持在一周一期,喜欢刷题的、或者对刷题有需要的同僚,可以跟着小班克我一起,每周一道算法题。当然,能力较强或者时间较多的朋友也可以自己去LeetCode上注册一个账号,按照自己的速度刷题。那么闲话不多说,我们一起来看看上期留下的问题的解决方案吧!
翻译过来就是:给出两个表示非负整数的数字链表,数字以相反的顺序存储,每个链表都存储该非负整数某一位上的数字。计算两个非负整数的和,并以链表的方式返回。简单做个比喻:342,以链表的存储形式就是,2->4->3。
解题思路如下:这道题在LeetCode上的难度是中等难度(在LeetCode上题目的难度只有简单、中等、困难。第一期的题目是简单)。但是我觉得这题要比上一题更加简单。我们只要将对应的位数相加即可,唯一麻烦一点的地方就是判断何时结束计算。小班克我在做这一题的时候,用了一个递归的方法,因为可以很简单的看出,其实每一位相加的规则都是一样的(满十进一之类的)。需要注意的是,递归之后返回的链表节点其实是表尾,那么我们直接来看代码吧。
/** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNode next; * public ListNode(int x) { val = x; } * } */public class Solution { public ListNode AddTwoNumbers(ListNode l1, ListNode l2) { AddTwoNumbersRecursion(l1, l2);
return l1; }
public void AddTwoNumbersRecursion(ListNode l1, ListNode l2) { l1.val += l2.val;
if (l1.val >= 10) { if (l1.next == null) l1.next = new ListNode(0);
l1.next.val += 1; l1.val %= 10; }
if (l1.next == null && l2.next == null) return; else if (l1.next == null && l2.next != null) l1.next = new ListNode(0); else if(l1.next != null && l2.next == null) l2.next = new ListNode(0);
AddTwoNumbersRecursion(l1.next, l2.next); }}
时间复杂度:O(n)。为什么是O(n)呢?自己去上一期补课去!(详情请见第一期的斐波那契数列)
空间复杂度:O(n)。
这个解题方案小班克我自己还是很满意的,我也是在写完第一期的内容之后,受到斐波那契数列的启发,写出了这题答案,数据说明了一切(也可能是大家都觉得这题太简单,懒得去想更快的解题方案吧)。
public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode dummyHead = new ListNode(0); ListNode p = l1, q = l2, curr = dummyHead; int carry = 0; while (p != null || q != null) { int x = (p != null) ? p.val : 0; int y = (q != null) ? q.val : 0; int sum = carry + x + y; carry = sum / 10; curr.next = new ListNode(sum % 10); curr = curr.next; if (p != null) p = p.next; if (q != null) q = q.next; } if (carry > 0) { curr.next = new ListNode(carry); } return dummyHead.next;}
解题思路:官方使用了一个 While 循环,当 p 和 q 都为空时,跳出循环。具体代码小班克觉得没什么可以细说的(有什么看不懂的可以给编辑大大留言,我相信编辑大大会给你们一个满意的答复的。手动滑稽= =)。
时间复杂度:O(Max(m, n))。这个 While 循环是当 p 和 q 都为空时,才会终止,因此,循环会执行 Max(p 的长度,q 的长度) 次。
空间复杂度:O(Max(m, n))。从程序中,我们可以看到每一次的 While 循环,都会重新创建 x、y、sum 三个临时变量,因此空间复杂度为 O(Max(p 的长度,q 的长度))。
那我们接下来就来看看下一期的题目,这一题的难度是中等难度:
翻译过来就是:给你一个字符串,找出最长的没有重复字符的子字符串的长度。
我相信大家不会都只能像小班克一样用穷举法做吧,干巴爹~
点击图片get往期内容
流下了不学无术的泪水:今天你刷题了吗(二)相关推荐
- 流下了不学无术的泪水——今天你刷题了吗(一)
点击上方"程序人生",选择"置顶公众号" 第一时间关注程序猿(媛)身边的故事 工作以后,你有多久没有做算法题了,反正班克我是工作一年了,然后一年没做算法题了. ...
- 流下了不学无术的泪水——今天你刷题了吗(三)
点击上方"程序人生",选择"置顶公众号" 第一时间关注程序猿(媛)身边的故事 插图作者:maxwellthebeech 编者按:<今天你刷题了吗>是 ...
- 高中信息技术——Flash动画制作刷题点整理(二)
前言:以下是针对高中信息技术多媒体模块Flash动画制作刷题点的整理. 1. 元件 Flash中的库里元件有以下三种: 1.1 影片剪辑 影片剪辑元件可以理解为大电影中的小电影,它可以独立于主 ...
- SQL leetcode 刷题答案(二)
承接上篇 SQL leetcode 刷题答案https://blog.csdn.net/hahaha66888/article/details/89925981 5.Big Countries sel ...
- Nico的刷题日记(二)
35. 搜索插入位置 题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 请必须使用时间复杂度为 O(log n) 的算 ...
- LeetCode刷题笔记 二叉树 二叉搜索树的操作
669 修剪二叉搜索树 给定一个二叉查找树和两个整数 L 和 R,且 L < R,试修剪此二叉查找树,使得修剪后所有节点的值都在 [L, R] 的范围内. 输入是一个二叉查找树和两个整数 ...
- leetcode刷题 74.搜索二维矩阵
题目分析 这是一道简单的查找二维矩阵的题目,所以解决这题有一个最简单的解法就是遍历二维数组即可:但是我们应该注意到题目中的每行整数从左到右是按升序排列的,第一个整数大于前一行的最后一个整数,介于此,我 ...
- 折半查找和二叉排序树的时间性能_leecode刷题----二分搜索与二叉查找(排序)树...
预备知识:二分查找 已知一个排序数组A,如A=[-1,2,5,20,90,100,207,800],另外一个乱序数组B,如B=[50,90,3,-1,2-7,80],求B中任意某个元素是否在A中出现, ...
- 《剑指0ffer》刷题笔记 -01 二维数组中的查找
参考链接 :https://cuijiahua.com/blog/2017/11/basis_1.html https://blog.csdn.net/wang454592297/article/de ...
最新文章
- c++小项目:通讯录管理系统
- illegal base64 character 3a_双11华硕多款产品再送豪礼 高端硬件通吃最新3A大作
- python3.7下载安装教程-CentOS 7 下 安装 Python3.7
- x264编码参数大测试:10 trellis(1000Kbps)
- Django中HttpResponse和JsonResponse的区别和用法
- Android官方开发文档Training系列课程中文版:线程执行操作之创建多线程管理器
- Java常用设计模式————单例模式
- AMP、HMP、SMP
- python错误提示库没有注册_SpringBoot实现登录注册常见问题解决方案
- 华硕笔记本电池软件_华硕灵耀X逍遥测评:11代酷睿处理器加持,王者归来
- lstm原理及实现_LSTM原理
- 开课吧:Java开发学习路线-基础知识
- 大二学科不挂科 速冲方法推荐(离散+概率+数电+大物)
- php程序员中文,php中文网“php程序员工具箱” v0.1版本上线
- 异国他乡-写在即将离开芬兰的早晨
- 百度地图Web API Python模块
- 王争-算法与数据结构专栏第一期福利笔记(数据结构与算法学习书单)
- android图片上传后台后旋转的关键原因:ExifInterface
- 数据分析 — 用户粘性的两个计算指标(DAU/MAU和月人均活跃天数)
- 基于OCC与OSG的CAD平台构建值gmsh划分效果测试