剑指Offer-1-20题刷题知识点总结Java

数组
第一题:二维数组中的查找
第六题:旋转数组的最小数字
第十三题:调整数组顺序使奇数位于偶数前面
第十九题:顺时针打印矩阵
思考与总结:

  1. 在Java中二维数组判空要考虑三种情况

1、二维数组首地址是否为空,即array==null
2、二维数组是否为{},即array.length==0的情况;
3、二维数组是否为{{}},即array.length==1&&array[0].length==0的情况;

  1. 对于有序数列要考虑怎样优化降低时间复杂度

第一题中数组每行递增,每列也递增,那么位于右上角和左下角的数字就很特殊,能够通过位置确定大小,避免从头到尾逐一寻找比较。
第六题中数组前半部分非递减,后半部分也是非递减,但总体不大于前半部分的数值,二分查找能够快速缩小范围,因为旋转会改变非递减数组本身的mid<high的特性,可以由此快速判断出旋转最小点位于前半还是后半。

  1. 顺时针打印二维数组从整行整列的角度考虑问题优化降低空间复杂度
  2. ArrayList相关知识点

导入import java.util.ArrayList<E>,其中E表示泛型,ArrayList用于存储对象,不能存储原生数据类型如int,长度可动态增长。

常用方法
ArrayList()构造函数,创建一个空列表,size为0
add(o:E):void在list的末尾添加一个元素o
add(index:int,o:E):void在list的index位置添加一个元素o
remove(o: Object): boolean删除list中第一个元素o,删除成功,返回true
remove(index: int): boolean删除指定index位置的元素,删除成功,返回true
indexOf(o: Object): int返回list中第一个匹配o的元素index
lastIndexOf(o: Object): int返回list中最后一个匹配o的元素index
get(index: int): E返回index处的元素
set(index: int, o: E): E设置指定index位置的元素为o
size():int返回list中元素个数
contains(o: Object): boolean如果list含有元素o,返回true
isEmpty(): boolean如果list为空,返回true
clear():void删除list所有元素
排序java.util.Collections.sort(arraylist)

创建对象:ArrayList<E> arraylist = new ArrayList<>();

链表
第三题:从尾到头打印链表
第十四题:链表中倒数第k个节点
第十五题:反转链表
第十六题:合并两个排序链表
思考与总结:

  1. 链表常常可以和递归联系起来解决问题
  2. 利用各种数据结构的特点,从尾到头打印链表正好和栈先进后出的特点符合
  3. 反向思考问题,对于单向链表,当找倒数比较麻烦时,从正数的方向思考,倒数第k即当A和B同时从头开始,A先走k步,B再从头和A同步开始,A和B始终保持k步的差距,当A到终点,B正好在倒数第k
  4. 反转链表只反转指针,不移动节点更高效简洁

栈和队列
第五题:用两个栈实现队列
第二十题:包含min函数的栈
思考与总结:

  1. 栈是先进后出,队列是先进先出,栈和队列元素进出顺序固定
  2. Stack相关知识点

导入import java.util.StackStack用于存储对象,不能存储原生数据类型如intStack类继承自Vector类。
常用方法:
Stack()构造函数
empty(): boolean如果栈为空,返回true
peek(): E获取栈顶对象并返回
pop(): E弹出栈顶对象并返回
push(E:o)入栈对象o
search(E:o): int获取对象在栈中的位置并返回,若不存在则返回-1
创建对象:Stack<E> stack = new Stack<>();

  1. Queue相关知识点

Queue是接口,常用LinkedList类就实现Queue接口
常用方法:
add(E:o): boolean向队列中添加对象,返回true,失败则抛出异常
offer(E:o): boolean向队列中添加对象,返回true,失败返回特殊值
element(): E获取队列头对象并返回,失败则抛出异常
peek(): E获取队列头对象并返回,失败返回特殊值
poll(): E出队队列头对象并返回,失败则返回特殊值
remove(): E出队队列头对象并返回,失败则抛出异常
search(E:o): int获取对象在栈中的位置并返回,若不存在则返回-1
创建对象:Queue<E> queue = new LinkedList<>();


第四题:重建二叉树
第十七题:树的子结构
第十八题:二叉树镜像
思考与总结:

  1. 树的结构特点多用递归解决问题,递归时一个是找到递归的问题,还有一个是找到递归的出口
  2. 其中第十八题涉及到两层递归,注意全面考虑各种子结构的情况,避免遗漏。

递归
第三题:从头到尾打印链表
第四题:重建二叉树
第七题:斐波那契数列
第八题:跳台阶
第九题:变态跳台阶
第十题:矩形覆盖
第十二题:数值的整数次方
第十六题:合并两个排序链表
第十七题:树的子结构
第十八题:二叉树镜像
思考与总结:

  1. 递归两个条件:子问题和出口
  2. 递归本质是栈,“递”就是入栈,递进,“归”就是出栈,回归

其他
第二题:替换空格
第十一题:二进制中1的个数
思考与总结:

  1. 善用二进制移位,有时可以提高效率,在第十二题中移位操作可优化时间复杂度
  2. String相关知识点

常用方法:
char charAt(int index)返回index处char值
String concat(String str)将str连接到字符串末尾
boolean endsWith(String suffix)判断字符串是否以suffix结尾
boolean equals(E: o)判断字符串是否和对象o相等
int indexOf(int ch)返回ch在字符串中第一次出现的index
int indexOf(int ch, int fromIndex)从fromIndex开始搜索,返回ch在字符串中第一次出现的index
int indexOf(String str)返回str在字符串中第一次出现的index
int indexOf(String str, int fromIndex)从fromIndex开始搜索,返回str在字符串中第一次出现的index
int lastIndexOf(int ch)返回ch在字符串中最后一次出现的index
int lastIndexOf(int ch, int fromIndex)从fromIndex开始搜索,返回ch在字符串中最后一次出现的index
int lastIndexOf(String str)返回str在字符串中最后一次出现的index
int lastIndexOf(String str, int fromIndex)从fromIndex开始搜索,返回str在字符串中最后一次出现的index
int length()返回字符串长度
String replace(char oldChar, char newChar)newChar替换oldChar,返回新字符串
String replaceAll(String regex, String replacement)把字符串中regex全部替换为replacement
String replaceFirst(String regex, String replacement)只替换第一个
String[] split(String regex)以regex拆分字符串
boolean startsWith(String prefix)判断字符串是否以prefix开头
boolean startsWith(String prefix, int toffset)判断从toffset开始字符串是否以prefix开头
char[] toCharArray()字符串转换为字符数组

深入理解String类请参考🔗

  1. StringBuffer相关知识点

不同于String的方法:
StringBuffer append(String s)追加s在字符串末尾
StringBuffer reverse()字符串逆序
delete(int start, int end)移除从start到end的字符
insert(int offset, int i)将 int 参数的字符串表示形式插入此序列中。
replace(int start, int end, String str)替换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值