程序员进阶之路必刷的68道算法题

这篇文章的目的是方便自己复习看,所以很多代码是经过优化的,并且几乎没有题解,只是提了提思路。如果第一次刷的不建议只看,建议看看思路然后自己去官方站做,如果看不懂可以去LeetCode瞧瞧大佬们的题解

文章目录

基础知识

数据结构

面试题03.数组中重复的数字

面试题04.二维数组中的查找

面试题05.替换空格

面试题06.从尾到头打印链表

面试题07.重建二叉树

面试题09.用两个栈实现队列

算法与数据操作

面试题10-I.斐波那契数列

面试题11.旋转数组的最小数字

面试题12.矩阵中的路径

面试题13.机器人的运动范围

面试题14-I.剪绳子

面试题15.二进制中1的个数

高质量的代码

代码完整性

面试题16.数值的整数次方

面试题17.打印从1到最大的n位数

面试题18.删除链表的节点

面试题19.正则表达式匹配

面试题20.表示数值的字符串

面试题21.调整数组顺序使奇数位于偶数前面

代码的鲁棒性

面试题22.链表中倒数第k个节点

面试题23.链表中环的入口节点(环形链表II)

面试题24.反转链表

面试题25.合并两个排序的链表

面试题26.树的子结构

解决面试题的思路

画图让抽象问题具体化

面试题27.二叉树的镜像

面试题28.对称的二叉树

面试题29.顺时针打印矩阵

举例让抽象问题具体化

面试题30.包含min函数的栈

面试题31.栈的压入、弹出序列

面试题32-III.从上到下打印二叉树III

面试题33.二叉搜索树的后序遍历序列

面试题34.二叉树中和为某一值的路径

分解让复杂问题简单化

面试题35.复杂链表的复制

面试题36.二叉搜索树与双向链表

面试题37.序列化二叉树

面试题38.字符串的排列

优化时间和空间效率

时间效率

面试题39.数组中出现次数超过一半的数字

面试题40.最小的k个数

面试题41.数据流中的中位数

面试题42.连续子数组的最大和

面试题43.1~n整数中1出现的次数

面试题44.数字序列中某一位的数字

面试题45.把数组排成最小的数

面试题46.把数字翻译成字符串

面试题47.礼物的最大价值

面试题48.最长不含重复字符的子字符串

时间效率额空间效率的平衡

面试题49.丑数

面试题50.第一个只出现一次的字符

面试题51.数组中的逆序对

面试题52.两个链表的第一个公共节点

面试中的各项能力

知识迁移能力

面试题53-I.在排序数组中查找数字I

面试题53-II.0~n-1中缺失的数字

面试题54.二叉搜索树的第k大节点

面试题55-I.二叉树的深度

面试题55-II.平衡二叉树

面试题56-I.数组中数字出现的次数

面试题56-II.数组中数字出现的次数II

面试题57.和为s的两个数字

面试题57-II.和为s的连续正数序列

面试题58-I.翻转单词顺序

面试题58-II.左旋转字符串

面试题59-I.滑动窗口的最大值

面试题59-II.队列的最大值

抽象建模能力

面试题60.n个骰子的点数

面试题61.扑克牌中的顺子

面试题62.圆圈中最后剩下的数字

面试题63.股票的最大利润

发散思维能力

面试题64.求1+2+…+n

面试题65.不用加减乘除做加法

面试题66.构建乘积数组

面试题67.把字符串转换成整数

面试题68-I.二叉搜索树的最近公共祖先

面试题68-II.二叉树的最近公共祖先

基础知识

数据结构

面试题03.数组中重复的数字

程序员进阶之路必刷的68道算法题_第1张图片

空间优先:原地排序法
遍历数组,将遍历的数试探放入值正确位置,如果正确位置已经有过正确数了,且不是当前位置,说明发现了重复数了,退出
如果正确位置不是正确值,将正确值交换到正确位置
(93%,100%)

class Solution {    
public int findRepeatNumber(int[] nums) 
{        
for (int i = 0; i < nums.length; i++) 
{            
int n = nums[i];            
//try            
if (n == nums[n] && n != i) return n;            
//swap            
int tmp = nums[i];            
nums[i] = nums[n];            
nums[n] = tmp;        
}        
//not find        
return -1;    
}
}

时间优先:字典
用两个字节的boolean 的数组,占用空间小

class Solution 
{    
public int findRepeatNumber(int[] nums) 
{        
boolean compare[] = new boolean[nums.length];        
for (int i = 0; i < nums.length; i++) 
{            
if (compare[nums[i]]) return nums[i];            
compare[nums[i]] = true;        
}        
return -1;    
}
}

面试题04.二维数组中的查找

程序员进阶之路必刷的68道算法题_第2张图片

从左下或者右上为起点的查找:查找状态树是BST
(双100%)

class Solution 
{    
public boolean findNumberIn2DArray(int[][] matrix, int target) 
{                
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) 
return false;        
int m = matrix.length;        
int n = matrix[0].length;        
int row = 0;        
int col = n - 1;        
while (row < m && col >= 0) 
{            
if (target == matrix[row][col]) 
return true;            
else if (target > matrix[row][col]) row++;            
else col--;        
}        
return false;    
}
}

你可能感兴趣的:(算法,链表,数据结构,架构,java)