牛客高频Top200
牛客+力扣热题
小样x
硕士毕业已工作,论文指导、定制开发、课程设计指导、系统部署、项目讲解等均可私信或私信留联系方式,用心指导
展开
-
牛客高频Top200刷题合集(java)
前言(可能牛客排序略有波动)注:先记录前100,配合剑指offerTop1 反转链表Top2 排序Top3 设计LRU缓存结构Top4 实现二叉树先序,中序和后序遍历Top5 寻找第K大的数Top6 两数之和Top7 合并两个有序链表Top8 用两个栈实现队列Top9 跳台阶Top10 链表中的节点每k个一组翻转Top11 子数组的最大累加和问题Top12 最长无重复子数组Top13 判断链表是否有环Top14 合并两个有序数组Top15 链表中环的入口节点Top16 括号原创 2021-08-09 16:59:03 · 508 阅读 · 0 评论 -
牛客top101题---删除有序链表中重复的元素-II (java)
题目对比删除有序链表中重复的元素-I,I是删除只留一个,II是重复就全删,前提都是升序链表。题解这题top101中官方解答如下,但只用了一个cur指针,比较是否重复全用cur.next和cur.next.next,这样理解起来就不那么直观了,还是用两个指针会更好理解,故记录下自己写的版本,top101.pdf文档中绝大部分的题解还是十分详细且易懂的。public class Solution { /** * * @param head ListNode类原创 2022-05-22 20:23:51 · 534 阅读 · 1 评论 -
两天高效学会Shell基础编程(赞赞赞)
前言所有的题都不用,tail、cat、grep、awk这种命令直接执行得出结果,全用逻辑bash shell语句编程原创 2022-01-05 19:47:27 · 874 阅读 · 0 评论 -
牛客Top200---合并区间 (java图解超详细)
题目解析可以先看一幅图来直观的感受整个合并过程整个合并过程如下:对于两个区间[a,b] [c,d]1、若 a < c < b,则这两个区间可合并,此时若b>d,则合并后的区间为[a,b],反之为[a,d]2、若 c > b, 则不能合并如红色框就可以合并成[a,d],这也是合并的第一种情况 a<c<b<d => [a,d]还有一种情况, 如第二幅图,a<c<d<b => [a,b]合并后的区间 [left,righ原创 2021-08-29 11:17:04 · 1051 阅读 · 1 评论 -
牛客Top200---进制转换(java)
题目解析与代码综上重要点是循环M%N,然后结果添加进字符串,M = M / N更新M代码如下import java.util.*;public class Solution { public String solve (int M, int N) { if(M == 0){ return "0"; } String s = "0123456789ABCDEF"; StringBuilder sb原创 2021-08-27 17:37:48 · 176 阅读 · 0 评论 -
牛客Top200---求路径(java图解)
题目一个机器人在m×n大小的地图的左上角(起点)。机器人每次向下或向右移动。机器人要到达地图的右下角(终点)。可以有多少种不同的路径从起点走到终点?解析下面这张图就是最直观的解法,第一行与第一列都只有一种走法,其它位置走法只要将左边和上边相加即可如第二行第三列有3种走法,三种颜色标注出来了,也就是上面有1种,左边有两种代码理解逻辑后,代码就很好写了import java.util.*;public class Solution { public int uniquePaths原创 2021-08-27 16:24:28 · 168 阅读 · 0 评论 -
牛客Top200---二叉树和为指定值的路径(java)
题目给定一个二叉树和一个值sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径例如:给出如下的二叉树,sum=22返回 [[5,4,11,2],[5,8,9]]代码方法理解起来也不难,就是先序遍历,遍历过程中对走过的路进行求和,如果遍历完一条路径不是想要的,则回退再遍历其它,回退时需要从集合中移除添加的节点,并且减去对应值import java.util.*;public class Solution { //初始化 ArrayList<ArrayLi原创 2021-08-27 14:45:37 · 165 阅读 · 0 评论 -
牛客Top200---数组中只出现一次的两个数字(java)
题目分析一看到关于出现次数第一反应就是用map集合,有key-value键值对,直接看代码吧,不难,而且他说了就两个数字,已经限定死了import java.util.*;public class Solution { public int[] FindNumsAppearOnce (int[] array) { //遍历整个数组,用hashmap统计出现的次数,然后将出现一次的存到数组中 Map<Integer, Integer> map =原创 2021-08-26 15:08:32 · 205 阅读 · 0 评论 -
牛客Top200---判断一个链表是否为回文结构(java图解)
题目分析这里理解就不难1、首先用快慢指针找到中间节点,循环用 while(fast != null && fast.next != null),分奇偶两种情况解释(1)奇数节点,如为3个,执行一次循环,slow和fast指向如下,此时slow已经指向中点如果只是fast != null这一个,那么还会执行一次循环,从而slow就错过了中间节点,所以奇数节点需要fast.next != null(2)偶数节点,如为四个,两次循环,fast != null不符合跳出,然后slow原创 2021-08-26 11:37:01 · 201 阅读 · 0 评论 -
牛客Top200---链表排序(java)
题目辅助数组这个是比较容易写出的方法,就是另外创建一个ArrayList,然后将链表中的值放到数组中排序,再创建一个新链表,时间复杂度与空间复杂度都是O(n)import java.util.*;/* * public class ListNode { * int val; * ListNode next = null; * } */public class Solution { public ListNode sortInList (ListNode head)原创 2021-08-24 16:15:24 · 92 阅读 · 0 评论 -
牛客Top200---判断回文(java)
题目代码这题还是比较简单的,不多赘述,直接上代码import java.util.*;public class Solution { public boolean judge (String str) { if (str == null || str == ""){ return true; } int len = str.length(); for (int i = 0; i < len /原创 2021-08-24 11:48:51 · 80 阅读 · 1 评论 -
牛客Top200---岛屿数量(java)
题目思路原创 2021-08-23 15:54:12 · 298 阅读 · 0 评论 -
牛客Top200---输出二叉树的右视图(java)
题目思路首先,需要重建二叉树,这个之前碰到过,重建二叉树跳转链接,然后可以对重建后的二叉树进行层次遍历,将每层最后一个节点值放入数组中,最后层次遍历结束返回数组即可,这里数组由于需要知道大小,所以要先用ArrayList来新增每层最后一个元素import java.util.*;public class Solution { public int[] solve (int[] xianxu, int[] zhongxu) { TreeNode root = reConst原创 2021-08-23 14:55:31 · 232 阅读 · 0 评论 -
牛客Top200---最长公共前缀(java)
题目分析这题可以用一个技巧,首先最长公共前缀是取决于什么的?那就是最长的那个字符串,和最短的那个字符串,取这两个字符串的公共部分。例1 [“abca”,“abc”,“abca”,“abc”,“abcc”]最长的是"abcc",一样长的比ASCI,而最短的是"abc",那么就只要计算这两个的公共部分,也就是"abc"例2 [“fl”,“flen”,“flow”,“fole”,“fpower”]最长的是"fpower",最短的是"fl",那么公共就是比较两者,只有一个相同,那么就返回"f"例3原创 2021-08-20 17:04:02 · 162 阅读 · 0 评论 -
牛客Top200---合并k个有序链表(java)
题目分析首先你要会写合并两个有序链表,这个题目就是合并两个链表的变形,如果懂合并两个,那么合并k个也就不难了,只要弄一个遍历即可,一开始最前面两个合并,将合并的结果与第一个合并,以此类推,每次都进行两个两个合并,知道和最后一个合并完毕,思路都不难代码import java.util.*;public class Solution { public ListNode mergeKLists(ArrayList<ListNode> lists) { //思路:k原创 2021-08-20 12:02:55 · 759 阅读 · 0 评论 -
牛客Top200---接雨水问题(java详解)
目录题目分析一(暴力法)分析二(双指针法)题目分析一(暴力法)首先暴力破解是最容易想到,且最容易理解的思路,我们观察可得,第一列和最后一列是不可能接到水的,所以只要看中间即可,我们只要从下标1遍历到arr.length-1,然后获取中间每一列的接水量求和即可,具体怎么求呢?1、首先获取第i根柱子,左右两边最高的柱子,比如i=1,那么其左边最高的就是arr[0]=3,右边最高就是arr[3]=5,然后取这两根中较短的一根减去柱子i的高度即可,故可得公式Math.min(max_left,max_原创 2021-08-19 15:25:32 · 780 阅读 · 0 评论 -
牛客Top200---买卖股票的最好时机(java)
题目分析这题还是比较简单的,它的意思就是要找最大价格和最小价格,也就是在最低点买,最高点抛,我们只要遍历一遍找到最大与最小即可,但是别忘了一种情况,就是股票没有涨,甚至在跌,所以初始化时要注意,如果min=prices[0],max=prices[0],return max-min,赋值第一个元素,那么就没有考虑跌的情况,这也是我第一次写没有考虑的。所以应该换个思路,max记录最大收益,初始max=0,就算一直跌,那么最大收益max也相应不变=0,每次更新最小值,并且用数组每个元素减去最小值,得到的值原创 2021-08-19 11:19:55 · 152 阅读 · 0 评论 -
牛客Top200---在旋转过的有序数组中寻找目标值(java)
题目解法这题不难,简单题,很容易想到直接for循环遍历,不能遍历到就返回-1,能遍历到就直接返回下标1、常规解import java.util.*;public class Solution { public int search (int[] nums, int target) { //遍历nums数组 for(int i = 0 ; i < nums.length ; i++){ if(nums[i] == ta原创 2021-08-18 17:19:38 · 171 阅读 · 0 评论 -
牛客Top200---最长递增子序列(求子序列+长度 画图详解java)
题目注意:这里字典序最小,直接看有点不好充分理解,等你看完整个解析就懂了解析解此题要用两个数组,一个temp数组用于记录递增子序列,还需要一个长度数组dp,记录新增的元素后数组的长度,可以用示例1画图给大家解释首先,先把arr[0]放进temp数组中,后面添加规则是新增元素e和temp中最后一位比较1、若e>arr[i],则直接添加到结尾2、若e=arr[i],则不添加3、若e<arr[i],则e将替换temp数组中第一个比e大的元素具体如下图在 dp 数组中标完号后,为了原创 2021-08-18 15:28:00 · 518 阅读 · 0 评论 -
牛客Top200---最长回文字符串(java)
题目题解:中心扩展法描述:遍历,从左到右遍历,然后向两端扩展假设每个字符都是回文串最中心的字符,从中心字符向两边扩展,若左右字符不同则他就不会是回文串。回文字符串需要分情况考虑,分奇偶两种情况,为奇数是i==i,然后向两边扩展,当为偶数时,先判断 i ==i+1 字符是否一样,一样则向两边扩展,否则他就不可能是回文串。最后回文长度就是right - left -1,这个可以举两个例子import java.util.*;public class Solution { publi原创 2021-08-13 11:49:11 · 1808 阅读 · 0 评论 -
牛客Top200---链表相加(java详解)
目录题目题解解法1:通过反转链表进行相加解法2:通过栈题目该题和大数加法类似,思路可以借鉴,大数加法题解解法1:通过反转链表进行相加import java.util.*;public class Solution { public ListNode addInList (ListNode head1, ListNode head2) { //解法1:通过反转链表相加 if(head1 == null){ return head2原创 2021-08-12 09:55:23 · 330 阅读 · 0 评论 -
牛客Top200---反转字符串(java)
题目题解import java.util.*;public class Solution { /** * 反转字符串 * @param str string字符串 * @return string字符串 */ public String solve (String str) { int left = 0; int right = str.length() - 1; char[] ch = st原创 2021-08-11 16:12:06 · 133 阅读 · 0 评论 -
牛客Top200---最长公共字符串(java)
题目题解import java.util.*;public class Solution { /** * longest common substring * @param str1 string字符串 the string * @param str2 string字符串 the string * @return string字符串 */ public String LCS (String str1, String str2) {原创 2021-08-11 11:32:34 · 161 阅读 · 0 评论 -
牛客Top200---大数加法(java详解)
题目题解import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算两个数之和 * @param s string字符串 表示第一个整数 * @param t string字符串 表示第二个整数 * @return string字符串 */ public String solve (String s, S原创 2021-08-11 11:07:31 · 506 阅读 · 0 评论 -
牛客Top200---删除链表中倒数第n个结点(java详解)
题目[相似扩展:找到链表中倒数第k个结点]思路总结:思路可借鉴上面,只是多加一个pre指针用于记录倒数第n个节点的前一个节点,即下面代码slow指针的前一个节点代码import java.util.*;public class Solution { public ListNode removeNthFromEnd (ListNode head, int n) { //1、首先,判断head是否为空,k是否符合要求 if(head == null || n原创 2021-08-11 09:28:25 · 147 阅读 · 0 评论 -
牛客Top200---括号序列(java详解)
题目import java.util.*;public class Solution { public boolean isValid (String s) { Stack<Character> stack = new Stack<>(); //注意"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法 //也就是说括号必须成对出现 char[] ch = s.toCharArray()原创 2021-08-10 17:22:13 · 487 阅读 · 0 评论 -
牛客Top200---合并两个有序数组
题目这题还是很简单的,它自己说了A会预先扩容为[4,5,6,0,0,0],我们只要将B放到对应0的位置就好,放完了在进行一个排序就行import java.util.*;public class Solution { public void merge(int A[], int m, int B[], int n) { for(int i = m ; i < m + n ; i++){ A[i] = B[i-m]; }原创 2021-08-10 15:49:44 · 90 阅读 · 0 评论 -
牛客Top200---最长无重复子数组(java详解)
题目import java.util.*;public class Solution { //核心思想就是记录最长连续不重复的,重复的会被去除就不是最长 public int maxLength (int[] arr) { // write code here LinkedList<Integer> list = new LinkedList<>(); int res=0; for(int i=0原创 2021-08-10 15:35:31 · 477 阅读 · 0 评论 -
牛客Top200---链表中的节点每k个一组翻转(java通俗易懂详解)
题目该题目就是反转链表的变形,加一个递归让其递归反转即可import java.util.*;public class Solution { public ListNode reverseKGroup (ListNode head, int k) { ListNode end = head; for (int i = 0; i < k; i++) {//找到翻转部分尾节点的下一个节点 if (end == null) {原创 2021-08-10 14:37:51 · 231 阅读 · 0 评论 -
牛客Top200 --- 设计LRU缓存结构详解
题目import java.util.*;public class Solution { public static void main(String[] args) { int[][] arr = new int[][]{{1,1,1},{1,2,2},{1,3,2},{2,1},{1,4,4},{2,2}}; int[] lruArr = LRU(arr, 3); System.out.println(Arrays.toString(lru原创 2021-08-09 16:11:10 · 110 阅读 · 0 评论 -
牛客Top200---二分查找II
题目import java.util.*;public class Solution { public int search (int[] nums, int target) { //二分查找的思路,两个标志位left和right //数组不能为空,然后执行二分查找循环,跳出的条件就是left>=right //二分的思想,顾名思义就是二分,(left+right)/2,然后分别left和right缩减范围 if(num原创 2021-08-10 09:45:14 · 144 阅读 · 0 评论 -
牛客Top200---找到字符串的最长无重复的字符子串
题目描述给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。解法看到题中重复字眼可以想到HashMap,然后算长度可以用双指针,相减即为长度1.为了判断重复,用 Map 保存区间内元素的(元素值,索引)。2.若右指针行至某一元素发现已在区间内存在,则记录此时区间长度并更新最长字串长度。3.更新区间及区间内元素:Map中去除左指针至重复元素索引位置这一段的元素键值对;start要取最大的,用索引算长度import java.util.*;public c原创 2021-03-23 22:46:17 · 175 阅读 · 0 评论 -
牛客Top200---子数组的最大累加和问题(java)
题目描述给定一个数组arr,返回子数组的最大累加和例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.题目保证没有全为负数的数据要求时间复杂度为O(n),空间复杂度为O(1)题解import java.util.*;public class Solution { /** * max sum of the subarray * @param arr int整型一维数原创 2021-03-20 09:40:33 · 122 阅读 · 0 评论 -
牛客Top200--两数之和(java)
题目描述给出一个整数数组,请在数组中找出两个加起来等于目标值的数,你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的假设给出的数组中只存在唯一解例如:给出的数组为 {20, 70, 110, 150},目标值为90输出 index1=1, index2=2题解1、暴力破解import java.util.*;public class Solution { /** *原创 2021-03-19 09:02:35 · 173 阅读 · 0 评论 -
牛客Top200---寻找第K大的数(java)
题目描述有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。题目解法最简单的方法,但没有按题目要求,直接调用java的数组排序接口import java.util.*;public class Solution { public int findKth(int[] a, int n, int K) { // write code here Ar原创 2021-03-18 22:47:34 · 287 阅读 · 0 评论 -
牛客Top200---求二叉树的层次遍历(java)
题目描述题解import java.util.*;public class Solution { /** * * @param root TreeNode类 * @return int整型ArrayList<ArrayList<>> */ public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) { // w原创 2021-03-17 09:09:17 · 113 阅读 · 0 评论 -
牛客Top200---实现二叉树先序,中序和后序遍历(java)
题目描述分别按照二叉树先序,中序和后序打印所有的节点。题解import java.util.*;public class Solution { /** * * @param root TreeNode类 the root of binary tree * @return int整型二维数组 */ public int[][] threeOrders (TreeNode root) { if(root == null){原创 2021-03-16 09:27:16 · 141 阅读 · 0 评论 -
牛客Top200---判断给定的链表中是否有环(java)
题目描述判断给定的链表中是否有环。如果有环则返回true,否则返回false。你能给出空间复杂度O(1)的解法么?解法快慢指针法fast为快指针,每次走两步,slow是慢指针,每次走一步若不存在环,fast永远在slow的前面,直到走到最后一个节点为空结束。若存在环,则fast指针总会经过若干圈后追上慢指针public class Solution { public boolean hasCycle(ListNode head) { //快慢指针法,时间复杂度为O(n原创 2021-03-15 09:45:01 · 117 阅读 · 0 评论 -
判定是否互为字符重排(java)
题目描述给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。题解用HashMap,记录字符出现次数,如果字符相同且出现次数相同,则能通过重新排列得到class Solution { public boolean CheckPermutation(String s1, String s2) { //重新排列成为另一个字符串,也就是两个字符串中所有字符出现次数相等 HashMap<Character,原创 2021-03-14 22:08:24 · 218 阅读 · 0 评论 -
牛客高频Top200---排序(题解+常用排序方法回顾 java)
目录一、题目描述二、题解2.1 回顾常用排序方法2.1.1 冒泡排序2.1.2 直接插入排序2.1.3 快速排序2.1.4 归并排序一、题目描述给定一个数组,请你编写一个函数,返回该数组排序后的形式。二、题解import java.util.*;public class Solution { public int[] MySort (int[] arr) { Arrays.sort(arr); return arr; }}上面方法可能最简单原创 2021-03-02 12:58:31 · 515 阅读 · 0 评论