算法必考的6大类
第一:常见的八大排序方式(尤其二分法插入排序、归并排序需要着重掌握其思想) 感觉快排好重要
第二:时间复杂度的计算
第三:链表相关算法,链表翻转,链表合并等(手写反转链表、链表复制、链表合并)
第四: 二叉树相关算法前序、中序、后序遍历(递归,迭代)
第五:字符串匹配、去重问题。
第六:数组查重问题。
红黑树与BL树
手写队列或者链表等数据结构的实现。
8.贪心算法相关问题
算法:二叉树遍历、链表、字符串匹配、二维数组旋转、排序、位运算,感觉基本上跑不出这几个
排序专项突破你: https://juejin.cn/post/6844903568273571853
排序(手写常见排序、归并排序、堆排序)
快速排序(Quick Sort), 归并排序(Merge Sort)的原理与代码实现。需要能讲明白代码中每一行的目的。快速排序时间复杂度平均状态下O(NlogN),空间复杂度O(1),归并排序最坏情况下时间复杂度O(NlogN),空间复杂度O(N)
入门题目:
Leetcode 148. Sort List
Leetcode 56. Merge Intervals
Leetcode 27. Remove elements
快排了解不?最坏的情况是怎样?如果有大量重复数据怎么优化?时间复杂度、空间复杂度?
一个大致有序的数组如何排序,最快时间复杂度
排序算法复杂度中nlgn中的lgn是怎么来的
7.写出你所知道的排序算法及时空复杂度,稳定性
字符串:
String 方式计算加法。
算法题:反向输出字符串
算法:翻转字符串成work am I
字符串中最长不重复子串
算法题:字符串移除多余空格,且技术单词首字符大写。
算法 两个字符串 比较最大的公共字符串 ,主要是思路 (面对问题,以大化小)
最后一道算法: 剑指 Offer 38. 字符串的排列 - 力扣(LeetCode) (leetcode-cn.com)
String 转 int。
重点: 字符的操作规则
1.字符类型 Character
字符串遍历后字符的操作
第一种:
char c;
String str=String.valueof(c);
第二种:
Stack stackChar =new Stack<>();
s.toCharArray(); //把String 转成char数组
3 .字符遍历: s.charAt
2.字符转ASCALL
3.ASCALL如何转字符
数组:(数组排序,数组反转,数组求和,数组重复冤案)
5.算法题,反转数组
5.算法,删除数组中的重复元素
4.两个不重复的数组集合中,求共同的元素。
无序数组中查找两个和为某一个值的数字,返回索引值
算法题:给定一个排好序的数组,找出最左边的某个指定数字的下标
找出一个无序数组中出现超过一半次数的数字;
算法:数组中出现频率最高的k个数,list. sort实现 时间复杂度
如何在无序数组中快速找到最小值
6.给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度
2.含有二维数组的题目(岛屿200,56)
数组相关重要操作:
6.数组排序
Arrays.sort(people);
3.二维数组转成一维数组看待
最大 K 问题
5.2000万个整数,找出第五十大的数字?
背包问题(最大容量与最大价值)
动态规划与递归的差异性,什么问题可以用动态规划,什么问题不可以
两个字符串,求其最长子串?例如abc1234,123bc(暴力方法的复杂度,动态规划的复杂度)
.算法题,不同面值的几个硬币,怎么求满足条件的最小值
其他:
6.求1000以内的水仙花数以及40亿以内的水仙花数
10.给你个数 1 吧,比如 1000011 里面有几个 1 ?
9.算法斐波那契台阶
100 亿个单词,找出出现频率最高的单词。要求几种方案;
二维坐标系中有一些点,找出一点直线覆盖尽可能多的
给定数组-1,0,1,0,-1,-4,0找出其中3个数相加为0的全部组合,给出解决方案
情景题:
6.北京市2个月摇一次号,摇中的概率是3000分之一,请问需要摇多久,概率能达到百分之50?
7.抛一枚硬币,正反面的概率各占50%,请问,连续两次反面的概率是多少? 正正,正反,反正,反反 ,出现的概率各占四分之一。
算法题:斐波拉契数列,递归的方式怎么优化?
栈的遍历:
会边遍历边删除
while (!stack.isEmpty()) {
int temp =stack.pop();
}
2者的区别:
// 取出栈顶的元素
String peekString = stack.peek();
String popString = stack.pop();
哈希表
HashMap的key是否可以为null?
HashTable 不可以而 HashMap 可以,HashMap 可以存一个 key 为 null 的元素
数据结构的题目统计
第一:数组:
1.0485题 :最大连续1的个数 太简单了
2.0283题: 移动0太简单了
3. 0027题: 移除元素 简单(最重要的,双指针)
第二:链表:
203: 移除链表元素
206:反转链表 (重要)
第三:队列:
933:最近的请求次数
第四:栈:
20: 有效的括号
496: 下一个 (栈+队列)
需要注意的地方:
l++ 和++l 的区别
-1: 是否是nums.leng-1
==:是否可以等于
+1:是否可以+1
1.集合的长度和集合的索引问题!(边界条件)
或者说是开闭区间
2. 中间的索引,2种办法:
第一种: int middle = left + (right - left) / 2; // 中间的位置得到
2. 最大值:Math.max()
1.node和treenode数据结构
2者的区别:
// 取出栈顶的元素
String peekString = stack.peek();
String popString = stack.pop();
组合题目
1.栈+哈希表 496
栈或者队列的使用:
双层list的使用,LinkedList嵌套用处
LinkedList<List<Integer>> result = new LinkedList<>(); // LinkedList
插入到第一个位置:
LinkedList> result =new LinkedList<>(); // LinkedList
result.addFirst(new ArrayList<>(list)); // LinkedList的作用
内循环和外循环的使用?while内循环和外循环
什么适合用while循环,什么适合用for循环?if的作用。
变量是放内循环还是外循环。放哪个位置!!!
do()whi()的使用!
2个元素交换
temp = nums[i]; // 保持0的值
nums[i] = nums[j];
nums[j] = temp; // 交互用temp值
-----------------------------------------------
重点:单项突破题目