剑指offer错题总结

365. 二进制中有多少个1
思路
num & (num - 1)即可消去一个1
错误
while (num != 0) 写成了 while (num & (num - 1) != 0) 这样写的话 num 没办法更新

35. 翻转链表
思路
两根指针改变下结点的指向
错误
while 中的判断条件应该为 while (head != null) 而不应该写成 while (head.next != null) 后者写法会漏掉最后一个结点

73. 前序遍历和中序遍历树构造二叉树
思路
前序遍历的第一个元素为根结点,在中序遍历数组中寻找根结点位置,分别将前序数组和中序数组分为左右子树两部分,用递归构建二叉树
错误

  1. 寻找位置方法写错,for 循环的起始应该是传入的形参 start 和 end,for (int i = start; i <= end; i++), 如果写成 for (int i = 0; i <= array.length; i++)可能会使问题规模无法降低,出现 stackoverflow 的错误。
  2. 注意在递归时传入的前序形参要减去 instart

38. 搜索二维矩阵 II
思路
从左下角或者右上角开始一次排除一行或者一列
错误
x 的初始赋值写错,忘记写减 1

合并两个排序链表
错误
最后两个应该用 if,用 while 会死循环

顺时针打印矩阵
思路
以 count 值从 0 开始作为起点,分为四步:从左到右打印一行,从上往下打印一列,从右往左打印一行,从下往上打印一列,执行第二步的前提是至少有两行,执行第三步的前提是至少有两行两列,执行第四步的前提是至少有三行两列
错误

  1. 打印循环判定条件没记住,应该是 while (count * 2 < row && count * 2 < col)
  2. 四个转角点的坐标没设定好,出现了重复打印

连续子数组的最大和
思路
前缀和
错误
minSum 的更新要写在 max 的后面

二叉树中和为某一值的路径
思路
递归 + 分治
错误

  1. 结果加入 results 要 deep copy
  2. 每一个递归结束要回溯, path.remove(path.size() - 1),path.remove() 用法记错

数组中只出现一次的数字
思路
异或 + differ &= -differ(得到最后一位的1)
错误

  1. 最后 for 循环分别异或求两个数时不能用两个 if 要用 if else 因为两个 if 会造成两个不同数再次异或到一起
  2. 最后for 循环中 if else 判断条件是 (nums[i] & differ) == 0,写 == 1 纠错了
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 动态规划 111. 爬楼梯思路类似斐波那契数列注意考虑第 0 阶的特殊情况 272. 爬楼梯 II思路类似上题,只...
    6默默Welsh阅读 2,461评论 0 1
  • 目录 1. 栈和队列1.用两个队列实现栈2.用两个栈实现队列3.实现一个栈,可以用常数级时间找出栈中的最小值4.判...
    MigrationUK阅读 3,058评论 4 20
  • //leetcode中还有花样链表题,这里几个例子,冰山一角 求单链表中结点的个数----时间复杂度O(n)这是最...
    暗黑破坏球嘿哈阅读 1,540评论 0 6
  • 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不...
    曲终人散Li阅读 3,371评论 0 19
  • 今天是要求孩子写日记的第三天,我知道很难,难得在于坚持两个字,我和孩子说,你写,爸爸也些,我陪着你一起写!...
    牛奶哥哥阅读 161评论 0 0