扑克牌中的顺子
从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
示例 1: 输入:[1,2,3,4,5]
输出:True
示例 2: 输入:[0,0,1,2,5]
输出:True
限制:
数组长度为 5
数组的数取值为 [0, 13] .
解题思路
- 除了 0 之外其他所有的牌都不能重复。
- 将数组按大小排序,遍历数组,如果是 0 则记录。
- 用后一个值减去当前值,如果差为 1 则正常,如果大于 1 则消耗 0 。
- 最后计算 0 的个数,如果为负数,就说明不是顺子,是整数或 0 则说明是顺子。
实现代码
var isStraight = function (nums) { nums = nums.sort((a, b) => a - b); let zores = 0; for (let i = 0; i < nums.length; i++) { if (nums[i] === 0) { zores = zores + 1; } else { if (nums[i + 1]) { if (nums[i + 1] === nums[i]) { return false; } zores = zores - (nums[i + 1] - nums[i] - 1); } } } return zores >= 0; };
一些碎碎念
其实自己入行以来对于算法一直都是很抵触的,但也会周期性的来看看 leetcode,然后周期性的脱坑。一个是平时工作的压力大到学习和生活的时间都被挤压了,另一个是看一些不熟悉的数据结构很难入定。
但是最近发现,自己好像从来没有考虑过什么样的代码是优秀的,高效的。我写代码的目标是为了完成任务还是为了实现自己的提升呢,一瞬间感觉自己好像从来没入门。
其实算法和数学题类似,大多数都离不开几套固定的解法,但是这可以让自己不停的灵活思考和保持对自己代码的审视。
就让我从这一道类似脑经急转弯的题开始,慢慢学习和审视自己的代码吧,题不难但写的不算好看,也不知道改怎么优化自己的结构。希望再次回头看的时候,可以看出自己的愚蠢。
该如何做
理解题意
- 题目中会涉及到一些数据结构,如二叉树,链表等,需要整理这方面的知识。明白不同数据结构的操作方法。
- 题目是否限制时间和空间复杂
整理思路
- 先不要写代码,将思路用文字记录下来,再用代码实现思路
- 整理思路时不用考虑复杂度,尽量记录多种思路
实现代码
- 代码简洁,命名规范
- 实现后尝试简化代码,优化美观度
- 涉及到数学的问题,需额外补充拓展知识
归纳总结
- 归类问题,总结算法规律
- 计算不同的复杂度,考虑实际应用场景