🌞Moon Will Know
🃏

力扣.扑克牌中的顺子

扑克牌中的顺子

从若干副扑克牌中随机抽 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] .

解题思路

  1. 除了 0 之外其他所有的牌都不能重复。
  1. 将数组按大小排序,遍历数组,如果是 0 则记录。
  1. 用后一个值减去当前值,如果差为 1 则正常,如果大于 1 则消耗 0 。
  1. 最后计算 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,然后周期性的脱坑。一个是平时工作的压力大到学习和生活的时间都被挤压了,另一个是看一些不熟悉的数据结构很难入定。 但是最近发现,自己好像从来没有考虑过什么样的代码是优秀的,高效的。我写代码的目标是为了完成任务还是为了实现自己的提升呢,一瞬间感觉自己好像从来没入门。 其实算法和数学题类似,大多数都离不开几套固定的解法,但是这可以让自己不停的灵活思考和保持对自己代码的审视。 就让我从这一道类似脑经急转弯的题开始,慢慢学习和审视自己的代码吧,题不难但写的不算好看,也不知道改怎么优化自己的结构。希望再次回头看的时候,可以看出自己的愚蠢。

该如何做

理解题意

  1. 题目中会涉及到一些数据结构,如二叉树,链表等,需要整理这方面的知识。明白不同数据结构的操作方法。
  1. 题目是否限制时间和空间复杂

整理思路

  1. 先不要写代码,将思路用文字记录下来,再用代码实现思路
  1. 整理思路时不用考虑复杂度,尽量记录多种思路

实现代码

  1. 代码简洁,命名规范
  1. 实现后尝试简化代码,优化美观度
  1. 涉及到数学的问题,需额外补充拓展知识

归纳总结

  1. 归类问题,总结算法规律
  1. 计算不同的复杂度,考虑实际应用场景