刷题
本分类为秋招常考题型
咖啡不加冰和糖
有志者,事竟成
展开
-
堆排序相关知识总结
相关连接:堆排序图解参考代码:public static void heapSort(int[] nums){ int len = nums.length; //1.建最大堆:从下到上,从左到右 for(int i = len / 2 - 1; i >= 0; i--){ heapify(nums, i, len); } //2.每次调整第0个元素和 “最后一个元素” 的位置 for (int i = len - 1; i > 0; i-原创 2021-02-23 13:19:12 · 141 阅读 · 0 评论 -
非递归前中后序遍历二叉树
1 前序遍历前序遍历为:根、左、右,我们可以借助一个栈来完成遍历,大致思路如下:根节点进栈,然后出栈,打印根节点的值value;根节点的右节点进栈;根节点的左结点进栈;这里是右节点先进栈,然后才是左节点进栈,那么下次出栈的时候就是左节点先出栈,即先遍历根节点的左节点。参考代码:public void preOrder(TreeNode root){ if(root == null)return; LinkedList<TreeNode> stack = new Linked原创 2020-09-08 13:22:51 · 132 阅读 · 0 评论 -
并发编程之生产者消费者模式
生产者消费者是解决什么问题的?多个线程之间的同步问题。解决生产者和消费者的强耦合问题。参考代码:package Top;import java.util.LinkedList;import java.util.Random;/** * @Author 86180 * @Date 2020/9/7 21:50 * @Version 1.0 **/public class ProductorConsumer { public static void main(Stri原创 2020-09-08 09:42:34 · 121 阅读 · 0 评论 -
无重复字符的最长子串
题目解析:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。参考代码: public int lengthOfLongestSubstring(String s) { if(s == null || s.length() == 0)return 0; Map<Character, Integer> map = new HashMap<>(); int left = 0; int max = 0; for(int i = 0; i原创 2020-09-05 22:20:42 · 106 阅读 · 0 评论 -
x 的平方根
题目描述实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。思路分析x的平方根的范围在1~x/2之间,所以我们可以用双指针解题:lower = 1;high = x/2; mid = lower + (high - lower) / 2;判断: mid * mid == x => return mid;mid * mid < x => lower = mid + 1;原创 2020-08-21 01:06:37 · 316 阅读 · 0 评论 -
被围绕的区域
题目描述:给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。思路分析:该题和岛屿数量特别相似,这道题的难点在于边界的0和内部多个0的连通情况的处理,如下图:底部边界的0和内部的0是连通的,所以都不需要把这些0改为X。(1)我们可以对边界进行dfs遍历,将所有的连通的0找到,改为字母‘A’;(2)遍历数组,遇到元素’0’,改为’X’,遇到元素‘A’,改为’0’可知‘A’是不需要修改的,所以要改回去。原创 2020-08-17 20:17:02 · 129 阅读 · 0 评论 -
最长公共子串
题目描述:有两个字符串str1和str2,求出两个字符串中最长公共子串长度。例子:str1=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最长公共子串长度为5。思路分析:(1)将2个字符串str1和str2分别以行和列组成一个二维数组res[][];(2)如果str1[i] == str2[j],res[i][j] = 1;(3)我们可以根据对角线来判断公共字符,最后从中选择出长度最大的字符。如下:图中可以看出:str1和str2共有5个公原创 2020-08-16 22:56:04 · 128 阅读 · 0 评论 -
查找
二分查找参考代码:public int binSearch(int[] a, int target){ int lower = 0; int high = a.length - 1; while(lower <= high){ int mid = lower + (high - lower) / 2; if(a[mid] > target)high = mid - 1; else if(a[mid] < target) lower = m原创 2020-08-16 21:44:25 · 103 阅读 · 0 评论 -
最长连续序列
题目描述:给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。题目分析:大致思路:找到每一个连续序列的首元素,然后求长度,最后返回多个连续序列中最大的长度。我们可以先将元素去重,然后遍历元素X:若元素X-1在不数组中,则判断以X为首的元素的连续序列的最大长度。否则,continue。怎么去重呢?将元素存到Set中!参考代码: public int longestConsecutive(int[] nums) { if(nums == nul原创 2020-08-16 03:25:16 · 189 阅读 · 0 评论 -
排序
冒泡排序public void Popsort(int[] nums){ int n = nums.length; boolean flag = false; for(int i = 0; i < n - 1; i++){ for(int j = 1; j <= n - 1 - i; j++){ if(nums[j] < nums[j - 1]){ swap(nums, j, j - 1); flag = true原创 2020-08-16 02:44:42 · 114 阅读 · 0 评论 -
最长公共子序列
题目描述:给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。题目分析:定义dp[i][j] 的含义是:对于 s1[1…i] 和 s2[1…j],它们的 LCS 长度是 dp[i][j]。则s1.charAt(i) == s2.charAt(j)时,dp[i][j] = dp[i - 1][j - 1]s1.charAt(i) != s2.charAt(j)时,dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1])参原创 2020-08-16 01:57:20 · 76 阅读 · 0 评论 -
三数之和
题目描述:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。题目分析:设置从头遍历链表,范围为0~length - 3,设置2个指针i,j,分别指向当前节点的下一个结点和最后一个结点,判断当前元素:x + nums[i] + nums[j] = 0;加入结果集。x + nums[i] + nums[j] < 0; 执行i++;x +原创 2020-08-16 00:50:43 · 70 阅读 · 0 评论 -
给定一个链表,删除奇数索引的节点
题目描述:给定一个链表,删除奇数索引的节点参考代码:索引从1开始时 //索引从1开始时 public static Node deleteOddNode(Node node){ //创建辅助结点 Node p = new Node(-1); p.next = node; Node q = p; while(q != null && q.next != null){//注意这里的q.原创 2020-08-15 02:10:14 · 752 阅读 · 0 评论 -
单向链表根据value奇偶性拆成2个链表,并且返回的两个链表是升序的
题目描述:面试题:一个单向链表,根据value的奇偶性拆成2个链表,并且返回的两个链表是升序的 。先来复习下直接插入排序算法:public void InsertSort(int[] num){ if(num == null || num.length == 0)return; for(int i = 1; i < num.length; i++){ if(num[i] < num[i - 1]){ int temp = num[i];原创 2020-08-15 01:24:50 · 302 阅读 · 0 评论 -
LeetCode之岛屿数量
题目描述给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。参考代码:DFS public int numIslands(char[][] grid) { if(grid == null)return 0; int count = 0; for(int i = 0; i < grid.length; i++){原创 2020-08-14 20:57:38 · 141 阅读 · 0 评论