剑指offer读书笔记:第二章,面试基本知识02
问题1 有序矩阵+右上角查找
方法有二
- 暴力查找
- 右上角查找
问题变形:寻找第k小的数据
方法有二
- 暴力遍历然后排序
- 右上角查找+二分查找
参考这个链接leetcode 668. Kth Smallest Number in Multiplication Table 有序矩阵搜索 + 右上角二分搜索
问题02 字符串地址
str1和str2会自动分配空间,所以地址是不同的
但是str3和str4其实是相同的
—->写时复制
—->Java的StringBuilder StringBuffer String
在这方面运行速度快慢为:StringBuilder > StringBuffer > String
- String为字符串常量,而StringBuilder和StringBuffer均为字符串变量;
在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
问题03 替换空格
方法有二
- 直接暴力移动替换,复杂度O(n*n)
-
O(n),先扫描空格数量计算替换后的字符串数量,然后遍历替换,省去了字符串的移动。注意要从后向前遍历
如下图:
—-》合并k个有序的数组
依次合并会超时,很费时间;
应该折半两两合并,知道得到最后结果
问题04 从尾到头打印链表
方法有二
- DFS深度优先遍历
- 使用栈
问题05 构建二叉树
直接参考这个博客leetcode 297. Serialize and Deserialize Binary Tree 二叉树的序列化和反序列化 + 深度优先遍历DFS
问题06 两个栈实现一个队列
进队时,压入stk1。
出队时,stk2弹出。
stk2为空时,stk1倒入stk2。两次逆序恢复了原序。
参考这个博客leetcode 232. Implement Queue using Stacks 双栈实现队列
1)取栈顶元素: 返回有元素的队列的首元素
2)判栈空:若队列a和b均为空则栈空
3)入栈:a队列当前有元素,b为空(倒过来也一样)则将需要入栈的元素先放b中,然后将a中的元素依次出列并入列倒b中。(保证有一个队列是空的)
4)出栈:将有元素的队列出列即可。
参考这个博客leetcode 225. Implement Stack using Queues 双队列实现栈