[剑指Offer]刷题遇到的问题

刷题遇到的问题

Posted by JinFei on March 7, 2020

从尾到头打印链表

快慢指针,如果要求的k大于链表长度的话 需要特殊判断一下

字符串的排列

不知道怎么写辅助函数

链表删除重复元素

写的不怎么顺畅 常常报段错误

调整数组顺序使奇数位于偶数前面

不会用log

顺时针打印矩阵

第二个for循环条件 记错了

丑数

不知道怎么初始化等,不会写

字符流中第一个不重复的字符

判断条件 应该 >= 0 初始化为-1,然后每次出现 从0开始,如果是第二次出现,记为-2

孩子们的游戏(圆圈中最后剩下的数)

记得要首先判断异常值,否则程序会崩溃

构建乘积数组

下标出问题 应该是 left[i] = left[i - 1] * A[i - 1]

旋转数组

不知道停止条件 ->

while(array[left] > array[right]){
    if(right - left == 1){
        return data[left];
    }
}
                    

最小的K个数

优先级队列的使用

priority_queue<int, vector<int>, greater<int> > pq; // 小元素具有较高优先级

树的子结构

段错误

二叉搜索树的后序遍历序列

索引 总是写错

二叉树中和为某一值的路径

不会写

剪绳子

dp递归公式

序列化和反序列化

没印象 不知道怎么下手

先序遍历

数组中只出现一次的数字

可以再练习一遍

数组中的逆序对

归并排序

正则表达式匹配

不会

将二叉搜索树转链表

不会

LRU链表

插入时,超过指定容量,需要从unorder_map中进行删除

两个链表相加

不知道怎么生成节点

  • 应该遍历总得结点,如果结点中有出入为0的,push进去
  • 初始化,第二个参数应该声明为空的vector

前缀树

节点不知道怎么定义 Node* node[26]

股票收益

  • buy[i] = max(buy[i - 1], sell[i - 2] - prices[i])
  • sell[i] = max(sell[i - 1], buy[i - 1] + prices[i])

站队问题

  • 需要记住插入的方式,第一个参数是迭代器指向具体的位置,第二个参数为要插入的值
  • res.insert(res.begin() + i[1], i)

完美平方数

  • dp[i] = min(dp[i], dp[i - j * j])

查找重复字符串的位置

  • 先统计各个字符串出现的次数
  • 然后一个size的序列进行查找
  • 查找到了就减1,中间小于1就直接break

下一个排列

  • 从后往前看,找到开始递减的数字,记为temp1,
  • 然后从后找,找到第一个比temp1大的数字,记为temp2
  • 然后temp1 与 temp2 进行互换
  • 然后把temp2的后面的数字全部进行转换

解析字符串

  • 用到栈

二叉树的非递归遍历

  • 不需要判断 node -> right 是否为空
  • 我们只需要直接赋值即可

矩形的环形遍历

  • row - 1 - i != i
  • col - 1 - i != i

dfs转换讲O转换成X

  • 遍历四周,将连接的转换成另外一个数字
  • 注意在遍历的时候,要记得判断转换的字符

复杂链表的赋值

  • 最后拆分链表时,有点困难
  • 需要先移动头指针

旋转数组的搜索

  • 二分 带等于号
  • 然后返回 data[mid] // 有个break条件