- 博客(86)
- 收藏
- 关注
原创 Nowcoder-HJ48从单向列表中删除指定节点的值
Nowcoder-HJ48从单向列表中删除指定节点的值万万没想到这么常规的题目,又学到了新的东西:构造链表因为牛客网的输入输出需要自己写,在链表没有搭建好的情况下,如何删除一个节点的前提是要有一个完整的链表。思路常规的从单向列表中删除指定节点的值伪代码:int deletNum ;ListNode cur = head;while(cur != null){ if(cur.next.val == deletNum){ cur.next = cur.next.next; break;
2020-08-19 11:40:37 228
原创 LeetCode java-17. 电话号码的字母组合
LeetCode java-17. 电话号码的字母组合(题目来自力扣网)思路回溯法参考代码电话号码的字母组合给出如下回溯函数 backtrack(combination, next_digits) ,它将一个目前已经产生的组合combination 和接下来准备要输入的数字 next_digits 作为参数。代码import java.util.ArrayList;import java.util.HashMap;import java.util.List;import jav
2020-06-17 12:02:06 229
原创 LeetCode java-46.全排列 and 47.全排列II
LeetCode java-46.全排列 and 47.全排列II(题目来自力扣网)思路回溯的经典题目参考一下文章,非常有价值:从全排列问题开始理解「回溯」算法(深度优先遍历 + 状态重置 + 剪枝)全排列回溯搜索 + 剪枝代码46.全排列import java.util.ArrayDeque;import java.util.ArrayList;import java.util.Deque;import java.util.List;public class Permute
2020-06-16 21:05:57 212
原创 LeetCode java-401. 二进制手表
LeetCode java-401. 二进制手表(题目来自力扣网)思路暴力递归遍历从00:00到11:59之间1 的个数count(int n) 函数是为了遍历一个数有几个1代码import java.util.ArrayList;import java.util.LinkedList;import java.util.List;public class ReadBinaryWatch { public List<String> readBinaryWatch
2020-06-16 18:52:11 224
原创 LeetCode java-784. 字母大小写全排列
LeetCode java-784. 字母大小写全排列(题目来自力扣网)思路方法一:递归法解释代码:ans.add(new StringBuilder()); 添加一个空字符串ans.add(new StringBuilder(ans.get(i))); 起到复制代码的作用具体步骤如下:方法二:回溯法Leetcode.784 字母大小写全排列当前字符若是数字则直接搜索下一个位置。若当前是英文字母,则分成两种情况分别向下搜索。当前下标与字符串长度相等则将变量串添加到结果集合中。
2020-06-16 12:06:44 386
原创 Nowcoder java-数组中的逆序对
Nowcoder java-数组中的逆序对(题目来自牛客网)思路引用牛客网讨论解答中的自己觉得讲的比较好的解答:过程:先把数组分割成子数组,先统计出子数组内部的逆序对的数目,然后再统计出两个相邻子数组之间的逆序对的数目。在统计逆序对的过程中,还需要对数组进行排序。如果对排序算法很熟悉,我们不难发现这个过程实际上就是归并排序。代码public class InversePairs { //统计逆序对的个数 int cnt; public int inverse
2020-06-15 20:21:14 128
原创 Nowcoder java-对称的二叉树
Nowcoder java-对称的二叉树(题目来自牛客网)思路方法一:递归法首先根节点以及其左右子树其次左子树的左子树和右子树的右子树相同最后左子树的右子树和右子树的左子树相同即可。方法二:利用栈成对存,成对取如果两个都为空,则返回true如果一个为空,一个不为空,则返回false如果两个都不为空,则判断两个两个节点的值是否相等,不相等直接返回false方法三:利用队列成对存,成对取如果两个都为空,则返回true如果一个为空,一个不为空,则返回false如果两个都
2020-06-15 19:27:39 90
原创 Nowcoder java-机器人的运动范围
Nowcoder java-机器人的运动范围(题目来自牛客网)思路回溯法剑指offer(68):机器人的运动范围(回溯法)代码public class MovingCount { public int movingCount(int threshold, int rows, int cols) { int flag[][] = new int[rows][cols]; //记录是否已经走过 return helper(0, 0, rows, cols,
2020-06-15 17:04:24 141
原创 Nowcoder java-矩阵中的路径
Nowcoder java-矩阵中的路径(题目来自牛客网)思路引用牛客网解答: 0.根据给定数组,初始化一个标志位数组,初始化为false,表示未走过,true表示已经走过,不能走第二次 1.根据行数和列数,遍历数组,先找到一个与str字符串的第一个元素相匹配的矩阵元素,进入judge 2.根据i和j先确定一维数组的位置,因为给定的matrix是一个一维数组 3.确定递归终止条件:越界,当前找到的矩阵值不等于数组对应位置的值,已经走过的,这三类情况,都直接false,
2020-06-15 11:52:29 100
原创 Nowcoder java-按之字形顺序打印二叉树
Nowcoder java-按之字形顺序打印二叉树(题目来自牛客网)思路个人觉得方法一很好理解。第一种方法:用两个栈来实现,用空间换时间第二种方法:利用Java中的LinkedList的底层实现是双向链表的特点。1)可用做队列,实现树的层次遍历2)可双向遍历,奇数层时从前向后遍历,偶数层时从后向前遍历代码import java.util.ArrayList;import java.util.Iterator;import java.util.LinkedList;import
2020-06-15 10:51:24 98
原创 Nowcoder java-从上往下打印二叉树
Nowcoder java-从上往下打印二叉树(题目来自牛客网)思路用arraylist模拟一个队列来存储相应的TreeNode使用两个队列一个存放节点,一个存放值。先将根节点加入到队列中然后遍历队列中的元素,遍历过程中,访问该元素的左右节点,再将左右子节点加入到队列中来。代码import java.util.ArrayList;public class PrintFromTopToBottom { public ArrayList<Integer> printF
2020-06-13 21:11:08 107
原创 Nowcoder java-滑动窗口的最大值
Nowcoder java-滑动窗口的最大值(题目来自牛客网)思路滑动窗口应当是队列,但为了得到滑动窗口的最大值,队列序可以从两端删除元素,因此使用双端队列。对新来的元素k,将其与双端队列中的元素相比较1)前面比k小的,直接移出队列(因为不再可能成为后面滑动窗口的最大值了)2)前面比k大的数,比较两者下标,判断这个数是否已不在窗口之内,不在了,直接移出队列,队列的第一个元素是滑动窗口中的最大值代码import java.util.ArrayList;import java.util.
2020-06-13 21:03:28 126
原创 Nowcoder java-二叉搜索树的第k个结点
Nowcoder java-二叉搜索树的第k个结点(题目来自牛客网)思路二叉搜索树按照中序遍历的顺序打印出来正好就是排序好的顺序。所以,按照中序遍历顺序找到第k个结点即可。代码import java.util.Stack;public class KthNode {//非递归 TreeNode kthNode(TreeNode pRoot, int k) {//搜索二叉树中序遍历就是按照从小到大的顺序排列 Stack<TreeNode> stack =
2020-06-13 20:46:36 128
原创 Nowcoder java-序列化二叉树
Nowcoder java-序列化二叉树(题目来自牛客网)思路前序序列化,那么反序列化时也必须是前序;中序序列化,那么反序列化时也必须是中序;后序序列化,那么反序列化时也必须是后序;层序序列化,那么反序列化时也必须是层序;所以说:怎么序列化就怎么反序列化代码import java.util.Collections;import java.util.LinkedList;import java.util.Queue;public class SerializeAndDeseria
2020-06-13 20:32:30 126
原创 Nowcoder java-删除链表中重复的结点
Nowcoder java-删除链表中重复的结点(题目来自牛客网)思路新建一个节点,防止头结点要被删除,以方便碰到第一个,第二个节点就相同的情况。设置 pre ,last 指针,pre指针指向当前确定不重复的那个节点,而last指针相当于工作指针,一直往后面搜索。代码public class DeleteDuplication { public ListNode deleteDuplication(ListNode pHead) { if (pHead == nul
2020-06-13 20:00:15 129
原创 Nowcoder java-正则表达式匹配
Nowcoder java-正则表达式匹配(题目来自牛客网)思路引用牛客网解题下的思路,截屏如下:代码public class Match { public boolean match(char[] str, char[] pattern) { if (str == null || pattern == null) { return false; } int strIndex = 0; int
2020-06-13 18:15:15 132
原创 第一个只出现一次的字符
Nowcoder java-第一个只出现一次的字符(题目来自牛客网)思路第一次遍历字符串,map中记录字符和字符所出现的次数。时间复杂度为O(n)第二次遍历字符,即可找到第一个次数唯一的字符。时间复杂度为O(1)总的时间复杂度为O(n)包含256个字符的辅助数组,大小为1k,可以认为空间复杂度为O(1)如果用Hashmap存储字符和对应的次数,那么第二次遍历的时候一定要遍历字符串本身,而不是直接从map中找的第一个次数为1的字符,因为hashmap存取无序,存地时候次数为1 的第一个字符,取
2020-06-13 11:45:36 112
原创 Nowcoder java-丑数
Nowcoder java-丑数(题目来自牛客网)思路建立一个新数组,按顺序从小到大存储丑数。用空间换时间(不挨个遍历验证是否是丑数)。因为丑数只含有2,3,5,所以我们不用挨个遍历每个数字,只需要在原来丑数的基础上乘以2或者3或者5就可以了,这样不是丑数就不用花时间验证了。只用比较3个数:用于乘2的最小的数、用于乘3的最小的数,用于乘5的最小的数。代码import java.util.ArrayList;public class GetUglyNumber_Solution {
2020-06-13 10:47:00 101
原创 Nowcoder java-把数组排成最小的数
Nowcoder java-把数组排成最小的数(题目来自牛客网)思路自定义一个比较大小的函数比较两个字符串s1,s2大小的时候,先将它们拼接起来,比较s1+s2,和s2+s1哪个大,如果s1+s2大,那说明s2应该放前面,所以按这个规则,s2就应该排在s1前面。代码运行的步骤如下:代码public class PrintMinNumber { public String printMinNumber(int [] numbers) { String str =
2020-06-12 18:01:21 115
原创 Nowcoder java-字符串的排列
Nowcoder java-字符串的排列(题目来自牛客网)思路方法一:回溯法固定第一个字符,递归取得首位后面的各种字符串组合;再把第一个字符与后面每一个字符交换,并同样递归获得首位后面的字符串组合;递归的出口,就是只剩一个字符的时候,递归的循环过程,就是从每个子串的第二个字符开始依次与第一个字符交换,然后继续处理子串。方法二:字典法一个全排列可看做一个字符串,字符串可有前缀、后缀。生成给定全排列的下一个排列.所谓一个的下一个就是这一个与下一个之间没有其他的。这就要求这一个与下一
2020-06-12 17:23:03 122
原创 Nowcoder java-最小的K个数
Nowcoder java-最小的K个数(题目来自牛客网)思路方法一:用最大堆保存这k个数,每次只和堆顶比,如果比堆顶小,删除堆顶,新数入堆方法二:Partition方法三:排序,添加前k个数代码import java.util.ArrayList;import java.util.Arrays;import java.util.Comparator;import java.util.PriorityQueue;public class GetLeastNumbers_Soluti
2020-06-11 18:34:21 130
原创 Nowcoder java-复杂链表的复制
Nowcoder java-复杂链表的复制(题目来自牛客网)思路1.遍历链表,复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面;2.重新遍历链表,复制老结点的随机指针给新结点,如A1.random = A.random.next;3.拆分链表,将链表拆分为原链表和复制后的链表代码public class Clone { public RandomListNode clone(RandomListNode pHead){ if (pHead == nu
2020-06-11 17:18:08 102
原创 Nowcoder java-二叉树中和为某一值的路径
Nowcoder java-二叉树中和为某一值的路径(题目来自牛客网)思路参考牛客网上的同学的思路分析:本题要求找到从根节点到各个叶子节点的每一条路径,并把路径上的所有节点之和与某个数相比较,这符合深度优先遍历(DFS)的特点。参考了几位同学的做法,主要方法useDFS的思路如下:一、将传入方法的节点的值加入路径列表path。二、判断该节点是否有孩子节点。 若没有孩子,则该节点为叶子节点,表示该路径已走完。比较该节点值和目标数值target是否相同,相同则把路径列表path添加到结
2020-06-11 16:29:09 115
原创 Nowcoder java-二叉搜索树的后序遍历序列
Nowcoder java-二叉搜索树的后序遍历序列(题目来自牛客网)思路 采用分治法的思想,找到根结点、左子树的序列、右子树的序列,分别判断左右子序列是否为二叉树的后序序列。 由题意可得: 1. 后序遍历序列的最后一个元素为二叉树的根节点; 2. 二叉搜索树左子树上所有的结点均小于根结点、右子树所有的结点均大于根结点。 算法步骤如下: 1. 找到根结点; 2. 遍历序列,找到第一个大于等于根结点的元素i,则i左侧为左子树、
2020-06-11 15:23:37 99
原创 包含min函数的栈
Nowcoder java-包含min函数的栈(题目来自牛客网)思路思路:用一个栈dateStack保存数据,用另外一个栈minStack为辅助栈,用来保存依次入栈最小的数比如: dataStack中依次入栈,5, 4, 3, 8, 10, 11, 12, 1 则minStack依次入栈, 5, 4, 3, no(3), no(3), no(3), no(3), 1no代表此次不入栈,每次入栈
2020-06-11 11:22:18 96
原创 Nowcoder java-顺时针打印矩阵
Nowcoder java-顺时针打印矩阵(题目来自牛客网)思路这个思路是我看过剑指offer上的解答,以及魔方旋转解法后,最容易理解的解法。主要体现在边界的处理上。下面是我引用的解法。简单来说,就是不断地收缩矩阵的边界定义四个变量代表范围,up、down、left、right向右走存入整行的值,当存入后,该行再也不会被遍历,代表上边界的 up 加一,同时判断是否和代表下边界的 down 交错向下走存入整列的值,当存入后,该列再也不会被遍历,代表右边界的 right 减一,同
2020-06-11 10:47:47 143
原创 树的子结构
Nowcoder java-树的子结构(题目来自牛客网)思路利用递归的思想。1.先从根节点开始比对,相同,则以此根节点为起点开始判断tree1是否包含tree2。2.如果根节点不匹配:a.就再从tree1根节点的左节点和tree2的根节点进行匹配,如果匹配,那么以根节点的左节点为起点开始判断是否包含tree2;b.如果不匹配,就再从tree1根节点的右节点和tree2的根节点进行匹配。3.判断是否包含子树的函数:如果Tree2已经遍历完了都能对应的上,返回true如果Tree2还没有遍
2020-06-10 20:10:20 102
原创 Nowcoder java-链表中倒数第k个结点
Nowcoder java-链表中倒数第k个结点(题目来自牛客网)思路首先让第一个指针先行k步,然后让第一个和第二个指针每次同行一步,直到第一个指针指向空节点第二个指针就是倒数第K个节点。考察鲁棒性:1.k如果小于等于0,没有意义2.如果头结点等于null,那么倒数第k个节点也为null3.如果链表的节点数少于k,则遍历链表时会指向null,所以在两个节点一起走之前,要加上if判断,即while的终止条件firstNode.next != null代码public class Fin
2020-06-10 18:01:37 117
原创 Nowcoder java-调整数组顺序使奇数位于偶数前面
Nowcoder java-调整数组顺序使奇数位于偶数前面(题目来自牛客网)思路方法一:第一种思路就是,遍历数组,如果是偶数则开始遍历该偶数之后的数字直到找到一个奇数,然后将该偶数 i 和 奇数 j 之间的偶数后移,将 j 位上的奇数放到 i 位置时间复杂度:O(n^2)空间复杂度:O(1)借鉴牛客官方详细的题解:方法二:第二种思路,新建两个数组,一个用来存放奇数,一个用来存放偶数,最后整合,将偶数数组添加到奇数数组之后。时间复杂度:O(n)空间复杂度:O(n)相对位置不变
2020-06-10 16:46:21 131
原创 Nowcoder java-从尾到头打印链表
Nowcoder java-从尾到头打印链表(题目来自牛客网)思路方法一:利用栈,先进后出方法二:ArrayList 中有个方法是 add(index,value),可以指定 index 位置插入value 值。所以我们在遍历 listNode 的同时将每个遇到的值插入到 list 的 0 位置,最后输出 listNode, 即可得到逆序链表代码import java.util.ArrayList;import java.util.Stack;public class PrintLi
2020-06-10 15:06:26 100
原创 Nowcoder java-替换空格
Nowcoder java-替换空格(题目来自牛客网)思路方法一:用Java自带的函数str.toString().replace(" “,”%20")。方法二:在当前字符串上进行替换。 时间复杂度O(n)空间复杂度O(1)。先计算替换后的字符串需要多大的空间,并对原字符串空间进行扩容;从后往前替换字符串的话,每个字符串只需要移动一次;如果从前往后,每个字符串需要多次移动,效率较低。方法三:开辟一个新的字符串。时间复杂度O(n)空间复杂度O(n)代码public class
2020-06-10 11:28:18 124
原创 Nowcoder java-二维数组中的查找
Nowcoder java-二维数组中的查找(题目来自牛客网)思路从左下角或者右上角的数开始查找目标函数。代码以右上角的数字为例:1.如果target 等于右上角的数,则返回该数字;2.如果target 大于右上角的数,则行数加;(因为右上角所在的行中,右上角的数字是最大的,该行一定没有比target大的数字)3.如果target 小于右上角的数,则列数减;(因为右上角所在的列中,右上角的数字是最小的,该列所有数字都比target大)复杂度时间复杂度O(m+n), 其中(m是行数,n
2020-06-10 10:15:54 184
原创 Nowcoder java-二叉搜索树与双向链表
Nowcoder java-二叉搜索树与双向链表(题目来自牛客网)思路利用栈,后补详细说明。代码import java.util.Stack;public class Solution { public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree==null){ return null; } Stack<TreeNode> s= new
2020-06-03 22:32:12 87
原创 Nowcoder java-剪绳子
Nowcoder java-剪绳子(题目来自牛客网)思路代码public class CutRope { public int cutRope(int target) { if (target == 2) { return 1; } else if (target == 3) { return 2; } if (target % 3 == 0) {
2020-06-03 22:21:14 94
原创 Nowcoder java-数据流中的中位数
Nowcoder java-数据流中的中位数(题目来自牛客网)思路【面试题63-数据流中的中位数】代码import java.util.Comparator;import java.util.PriorityQueue;public class GetMedian { //小顶堆 private PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(); //大顶堆
2020-06-03 22:03:48 95
原创 Nowcoder java-把二叉树打印成多行
Nowcoder java-把二叉树打印成多行(题目来自牛客网)思路每次出队一个元素,就将该元素的孩子节点加入队列中,直至队列中元素个数为0时,出队的顺序就是该二叉树的层次遍历结果。代码import java.util.*;public class Print { ArrayList<ArrayList<Integer>> print(TreeNode pRoot) { ArrayList<ArrayList<Integer&
2020-06-03 21:50:24 89
原创 Nowcoder java-二叉树的下一个结点
Nowcoder java-二叉树的下一个结点(题目来自牛客网)思路借鉴他人的思路:两个思路是一样的。代码public class GetNext { public TreeLinkNode getNext(TreeLinkNode pNode) { if (pNode == null){ return null; } if (pNode.right != null){//如果有右子树,则找右子树的最左节点
2020-06-03 20:26:56 84
原创 Nowcoder java-链表中环的入口结点
Nowcoder java-链表中环的入口结点(题目来自牛客网)思路左神讲的 先说个定理:两个指针一个fast、一个slow同时从一个链表的头部出发fast一次走2步,slow一次走一步,如果该链表有环,两个指针必然在环内相遇此时只需要把其中的一个指针重新指向链表头部,另一个不变(还在环内), 这次两个指针一次走一步,相遇的地方就是入口节点。原理代码public class EntryNodeOfLoop { public ListNode entryNodeOfLoop(L
2020-06-03 16:47:04 94
原创 Nowcoder java-字符流中第一个不重复的字符
Nowcoder java-字符流中第一个不重复的字符(题目来自牛客网)思路方法一:队列将进来的字符存入到队列中,进来一次,就对相应坐标加一,统计出出现次数队列特点,先进先出,拿到的是第一个次数为1的ch方法二:用HashMap利用<key,value>,key存储长,value存储次数,最后拿到key为1 的长即可。代码//import java.util.LinkedList;//方法一 : 队列//public class FirstAppearingOnce {
2020-06-03 15:46:50 118
原创 Nowcoder java-不用加减乘除做加法
Nowcoder java-不用加减乘除做加法(题目来自牛客网)思路1.两个数异或:相当于每一位相加,而不考虑进位;2.两个数相与,并左移一位:相当于求得进位;3.将上述两步的结果相加代码import java.util.Scanner;public class Add { public static void main(String[] args) { Scanner input = new Scanner(System.in); int
2020-06-02 19:59:11 139
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人