简介
每刷过一道题目,把对于题目的分析记录在此,本篇不追求系统,做到什么想到什么都写在这里。好记性不如烂笔头,主要原因是本人记性比较差。
果然每接触一道就得记一道,昨天刷了好多不想记,隔了一天之后绝对不会主动回去找那些题了。
我发现一篇文章记录下刷过的有趣的题目实在是太长了,还是拆分为多篇文章,以题目类型作为分类吧。
分类
- 哈希等价多米诺骨牌的数量
- 字符串:力扣题型笔记 - 字符串类
- 图岛屿数量由斜杠划分区域保证图可完全遍历最小体力消耗路径
- 树二叉树的右视图
- 集合等式方程可满足性
- 查找:力扣题型笔记 - 查找类
- 其他数组中的逆序对
提示
- 除非题目提示是原地算法,否则不要修改传入的数据。
- 对于传入的引用类型数据,除非题目提及,不得对该数据进行修改,即使很多官方题解也这么做,但不值得学习。这一点不是对于刷题而言,而是对于开发而言。规范的开发必须保证数据的安全性,作为参数传进来的数据应当作为数据源而不应当作为中间数据。
在开发中,如果你的 API 对传入的数据进行了修改并且你的接口文档没有提及,调用方依照惯例把一个不可变的数据传入 API,得到正确的结果,但该数据的结构或者内容发生改变,整体系统就出现了隐患。尤其是将对象的私有数据域或者 final 域传入 API 时,虽然这样做传入者本身操作有引用泄露的嫌疑,但是开发者必须秉持考虑一切情况的理念进行开发。因此,请不要为了节省内存而牺牲系统的健壮性。 - 看题目
- 第一步读题意,第二步问范围,第三步看要求。一切没有告知范围的题目,都应该以最大程序可以接受的量级来考虑。
- 对一切数组或集合类型参数,第一步是进行 null 判断和空元素判断。
- 同理,null 判断是对于开发而言而非对于刷题而言,而空元素判断则是刷题也需要注意的。虽然对参数判 null 对于刷题可有可无,但是出于养成好习惯的目的,基本上我都会习惯带上的。
- 对于需要用到比较整型规则的题目,请使用 Integer.compare(o1, o2)
- 因为整型存在溢出问题,Integer.MIN_VALUE - Integer.MAX_VALUE 本应为负数,但是溢出后结果为 1。
Integer.MIN_VALUE = 0b10000000_00000000_00000000_00000000
Integer.MAX_VALUE = 0b01111111_11111111_11111111_11111111
~ (MAX_VALUE) + 1 = 0b10000000_00000000_00000000_00000001 // 负数补码等于原码取反加一。
+ = 0b00000000_00000000_00000000_00000001 = 1
- 因此,如果使用(o1, o2) -> o1 - o2 的方式判断顺序,将会发生错误。
- 取反或者取绝对值请考虑 Integer.MIN_VALUE。
- 由于整型溢出,-Integer.MIN_VALUE 或 Math.abs(Integer.MIN_VALUE) 的结构都将是它自身。
题目难度进阶
- 数组变更为无限流
- 对于数组统计类型的题目,通常进阶难题都可以思考:将数组转化为内存无法放下的无限流,该如何处理。
哈希
利用映射解决问题的题目。
题目
等价多米诺骨牌对的数量
等价多米诺骨牌对数量:本质上就是求相同无序偶对的数量。思路非常简单,分为两步:
- 如何将无序偶用相同的元素表示。
由于无序偶中的元素都是 1 ~ 9,所以无序偶可以直接转化为一个相同的数,例如对于 [1,2] 和 [2,1],