lecode 刷题知识点
1.刷题要领
1.一般和数学有关的算法,都会有特殊情况(临界值),这种情况一般都是采用“分类讨论”的思想
2.对于做过的题目,也要知道这道题解法的名称。而不是仅仅知道这道题如何做。
3.对于一道题目至少查看两种方法去解答【特别是题目已经给出了这道题可能有多种解法】
2.常见问题与错误
1.超时问题:可以将for的双循环变成while来执行,或者一个指针变成两个指针(大部分情况下都是使用暴力解法出现的情况,这时候只能另寻他法解决超时问题)
2.对于数组中的覆盖,一定要自己加上一个循环,这样才能让后面的元素全部覆盖前面的元素。
3.如果参数列表和返回值类型不一致,则需要定义一个和返回值类型一下的变量。来作为返回值类型的返回值。
4.第一个用例可以通过,但是第二个用例却没有通过
- 不等号的地方可能出现“=”忘添加或者多添加的情况
- 循环中数组的长度可能多-1,或者未-1的情况
3 .格式学习
1.边界判断可以这样表示:if(xxxx) return xxxx;
2.字符串如果不想给初值,也一定要给个空值:String s=“”;【注意不是s=null,这是错得】
3.while(n–>0):这个表示n每次循环都自减,直到自减到0为止。
4.定义一个数据类型的最值
int result=Integer.MAX_VALUE;
既然是二叉搜索树,一定要利用二叉搜索树的特点,就是二叉搜索的树的中序遍历是一个递增的数列。大部分题目都是利用这一条特点进行出题
2.常用的函数调用
2.1数学常用函数
最值:Math.max(x1,x2):主要是求出两个变量的最值,同理有Math.min(x1,x2)
String类是Java最常用的API,它包含了大量处理字符串的方法,比较常用的有
绝对值:Math.abs(x1-x2)/Math.abs(x):求两个值差值的绝对值/求某个值的绝对值
开根号:sqrt(10):开10的平方根。=3.16……
幂次方:pow(x1,x2) 返回第一个参数的第二个参数次幂的值。也就是2的3次方
阶乘:这个没有函数,这个只有一个递归调用的函数
2.3 字符串常用函数
char charAt(int index):返回指定索引处的字符;
String substring(int beginIndex, int endIndex):从此字符串中截取出一部分子字符串;
String[] split(String regex):以指定的规则将此字符串分割成数组;
String trim():删除字符串前导和后置的空格;
int indexOf(String str):返回子串在此字符串首次出现的索引;
int lastIndexOf(String str):返回子串在此字符串最后出现的索引;
boolean startsWith(String prefix):判断此字符串是否以指定的前缀开头;
boolean endsWith(String suffix):判断此字符串是否以指定的后缀结尾;
String toUpperCase():将此字符串中所有的字符大写;
String toLowerCase():将此字符串中所有的字符小写;
String replaceFirst(String regex, String replacement):用指定字符串替换第一个匹配的子串;
String replaceAll(String regex, String replacement):用指定字符串替换所有的匹配的子串。
String replace(charSequence target,CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
2.3.字符串和其他数据类型之间的转化:
char[] chars = s.toCharArray():字符串转化成字符数组。
String string=String.ValueOf(int n):整型数组转化成字符串。
int num=Integer.parseInt(String s):字符串转化成整型数据。
char charAt(int index):返回字符串某索引处的字符。
s.copyValueOf(c【c是一个字符串数组】) 方法,主要是将java定义的字符串数组转为一个字符串
count[s.charAt(i) - ‘a’]:s.charAt(i) - ‘a’,求字母之间的ascell之间的差值。
小写字母asell范围:a-z:97-122。
count[s.charAt(i) - ‘a’]++:求的是字符串中对应字母的个数。这个字母的位置是在count数组里面是有序的。
2.4.数组常用函数
1.Arrays.sort(nums):对数组进行排序
2.Arrays.fill(nums,int):给数组全部填充某个类型的数据
Arrays.fill(nums,0):数据全部填充为0;
Arrays.fill(c,‘.’):给数组全部添加为’.';
3.Arrays.equals(s,t):两个字符串是否相等。
4.Arrays.asList(x,y,z,……):将数据添加到列表中。
2.5.集合中常见的方法
set:
add():集合中添加元素
contains():集合中包含元素
size():集合的长度
remove():集合中移除元素
4.常见的表示方法
1.数组全为零表示方法:
2.6 栈的方法
boolean empty():判断栈是否为空
peek():查看栈顶部的对象(取出栈顶的值),但不从栈堆中删除它(返回栈顶上的值)
pop():移除栈顶部的对象,并作为此函数的值返回该对象
push( E item):把项压入堆栈顶部
int search(Object 0):返回对象在堆栈中的位置,以1为基数
size():栈的长度。
2.7.队列
add(E e):将指定元素插入队列
offer(E e): 将指定的元素插入此队列
peek():获取但不移除队列的头,如果队列为空,则返回null
poll():获取并删除队列的头,如果次队列为空,则返回null
remove():获取并移除此队列的头
size():que.size():获取队列的长度、
element() 获取,但是不移除此队列的头。 此方法与 peek 唯一的不同在于:此队列为空时将抛出一个异常。
empty()和isEmpty():两者没有区别,可以通用。
isEmpty()可以判断一个顺序容器里面是否有元素
empty():可以判断一个顺序容器里面是否有元素
字符串中只有isEmpty()方法,
而栈中两种方法均可以实现
2.8 链表
链表常见结构
1.链表判断是否存在,以及链表判空:if(headnull || head.nextnull) return head:
2.list.size():返回列表中的元素数(这个市场用,链表的长度)
1.list.add(x):添加元素到列表中
2.list.addAll(Collection<? extends E> c):添加指定 collection 中的所有元素到此列表的结尾
3.isEmpty():如果列表不包含元素,则返回true;
4.indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。
5.list.size():返回列表中的元素数
6.list.remove(x):删除列表中的元素
7.contains(Object o) :如果列表包含指定的元素,则返回 true。
8.equals(Object o) :比较指定的对象与列表是否相等。
2.9 虚拟头结点的设定
这里给链表添加一个虚拟的头结点
ListNode dummy = new ListNode(-1, head);
这个表示dummy的后一个结点是头结点。
dummy.next=head
设置完毕虚拟头结点pre,也就是head的前一个结点
ListNode pre = dummy;
设置头结点的下一个结点,cur
ListNode cur = head;
ListNode pre=null;
ListNode cur=head;
while(cur!=null){
ListNode nextemp=cur.next;
下面三个是交换的方法。也就是说每次将交换后的数据组成的链表和下一个将要反转的结点进行交换。将已经交换反转后的链表作为一个整体,和即将交换的结点进行交换,同时结点往下递推。也就是我们说的局部整体法
cur.next=pre;
pre=cur;
cur=nextemp;
}
return pre;
ListNode list = new ListNode(0):初始化一个空节点,初始赋值为0,指针指向为list【一般此代码用在没有头结点或者需要双指针遍历等情况】
ListNode list=null:定义一个空链表
通常定义一个空节点还需要有节点的next指针指向,否则只是定义一个空节点
ListNode list = new ListNode(0);
list.next=head;
3.二叉树题目分析
1.第一类:只关注二叉树的值,而不关注二叉树的本身结构
1.解决方案:这一类主要关注二叉树的相关遍历算法,并且往这些地方靠就可以了
2.第二类:只关注二叉树的本身结构,而不关注二叉树的值结构
3.第三类:以上两者都关注【对称二叉树,相等二叉树,另一个树的子树】
首先处理树的本身结构是否存在:利用多条if语句
再处理树中的结点值问题:只有结点值符合定义才为真
