- 博客(326)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 PAT乙级习题解答C语言(汇总)
题号 题名 1001 害死人不偿命的(3n+1)猜想 1002 写出这个数 1003 我要通过! 1004 成绩排名 1005 继续(3n+1)猜想 1006 换个格式输出整数 1007 素数对猜想 1008 数组元素循环右移问题 1009 说反话 1010 一元多项式求导 1011...
2019-07-24 20:48:27
10943
6
原创 LeetCode670—最大交换(java版)
题目描述:标签:贪心 数学给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。代码:思路分析:从高位开始,寻找能否在低位找到替换位,替换的数字尽可能大,当有同大时选择更低的。class Solution { public int maximumSwap(int num) { char[] array = String.valueOf(num).toCharArray(); for(int i = 0;i &..
2021-09-10 10:45:11
536
1
原创 LeetCode86—分割链表(java版)
题目描述:标签:链表 双指针给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。代码:思路分析:构建两个链表,一个链表smallHead保存小于x的数,一个链表largeHead保存大于等于x的数,然后将smallHead的链尾接到largeHead的头部,并将largeHead的链尾置空。/** * Definition for s..
2021-09-10 10:33:50
402
原创 LeetCode61—旋转链表(java版)
题目描述:标签:链表 双指针给你一个链表的头节点head,旋转链表,将链表每个节点向右移动k个位置。代码:思路分析:1、首先要有链表环的思想,如果移动的k是链表长度n的倍数,则说明没有移动保持原样,所以这里要有对k%n取余的思想。当形成链表环之后,要找到链表的最后一个节点是哪个,然后在该节点处断开即可。2、处理特殊情况,链表为空或者链表长度为1,都返回原链表即可3、统计链表长度,这里要注意因为要将最后一个节点与链表头连接在一起,所以不能用cur==null来作为...
2021-09-10 10:14:46
405
原创 剑指Offer37—序列化二叉树(java版)
题目描述:标签:树 深度优先搜索 广度优先搜索 设计 字符串 二叉树请实现两个函数,分别用来序列化和反序列化二叉树。你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; ...
2021-09-09 19:28:51
176
原创 剑指Offer36—二叉树搜索树与双向列表(java版)
题目描述:标签:栈 树 深度优先搜索 二叉搜索树 链表 二叉树 双向链表输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。代码:思路分析:实际上就是想把一个节点的左子结点指针和右子结点指针改变成前驱结点指针和后继结点指针。1、首先知道一个性质:中序遍历二叉搜索树得到的是递增序列。所以采用中序遍历递归。2、中序遍历具体实现步骤:①首先定义全局变量pre和head用来表示前驱结点和链表的表头。...
2021-09-09 17:32:48
139
原创 剑指Offer34—二叉树中和为某一值的路径(java版)
题目描述:标签:树 深度优先搜索 回溯 二叉树输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。代码:思路分析:利用回溯方法1、递归结束条件:当前结点为null,则直接返回;2、将当前结点值添加入path,并将相应的target相应减去当前结点值,做以下两种情况判断:①如果当前traget==0说明路径和满足条件,还要判断当前结点是不是叶子结点,是的话将path添加到ans中;②否则...
2021-09-09 09:08:28
139
原创 剑指Offer33—二叉搜索树的后序遍历序列(java版)
题目描述:标签:栈 树 二叉搜索树 递归 二叉树 单调栈输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。代码:思路分析:1、后序遍历是“左-右-中”的顺序,二叉搜索树的定义:根节点的值大于它左子树的所有值,小于它右子树的所有值。2、所以后序遍历数组的最后一个值是根节点,通过循环遍历,找到左右子树的分界下标,分界下标以前的所有数都小于根节点的值,分解下标以后的所有数都大...
2021-09-08 22:25:33
168
原创 剑指Offer32-Ⅲ—从上到下打印二叉树Ⅲ(java版)
题目描述:标签:树 广度优先搜索 二叉树请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。代码:思路分析:层序遍历,不过在每一组添加数据的时候做了层数不同时添加方式不同的判断/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode ...
2021-09-08 22:10:37
106
原创 剑指Offer32-Ⅱ—从上到下打印二叉树Ⅱ(java版)
题目描述:标签:树 广度优先搜索 二叉树从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。代码:思路分析:层序遍历的思想,不过需要每层添加一次。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) ...
2021-09-08 14:52:29
97
原创 剑指Offer32-Ⅰ—从上到下打印二叉树(java版)
题目描述:标签:树 广度优先搜索 二叉树从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。代码:思路分析:层序遍历的思想1、首先最重要的是使用队列+广度优先搜索来实现层序遍历操作。2、把根节点加入队列,对应此时的层数。以此时队列的长度为循环终止条件开始循环:取队列节点的值加入当层的list,并把该节点的左右节点加入队列。其实每层即对应一次大循环此时队列里的节点个数。/** * Definition for a binary tree node....
2021-09-08 11:59:05
112
原创 剑指Offer26—树的子结构(java版)
题目描述:标签:树 深度优先搜索 二叉树输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。代码:思路分析:1、先序遍历二叉树A,即体现在isSubStructure的return写法上,先用二叉树A的根节点和二叉树B作对比,调用isSubTree方法,再用A.left和B对比,最后用A.right和B对比,即是一个"中-左-右"的先序遍历顺序。2、对比是否是子树的方法isSubTre...
2021-09-08 11:28:36
167
原创 剑指OfferJZ57—二叉树的下一个结点(java版)
题目描述:(来源:牛客网)标签:二叉树给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。代码:思路分析:1、假如当前结点有右子树,则它的下一个结点是右子树最左边的结点2、假如当前结点没有右子树,则它的下一个结点可能是它的父节点①如果父节点.left=当前结点,则返回父节点②如果不等,说明是它的右儿子得到的父节点,则一直回溯到根节点,返回null/*public clas.
2021-09-06 10:04:04
79
原创 剑指Offer52—两个链表的第一个公共节点(java版)
题目描述:标签:哈希表 链表 双指针输入两个链表,找出它们的第一个公共节点。注意:如果两个链表没有交点,返回 null.在返回结果后,两个链表仍须保持原有的结构。可假定整个链表结构中没有循环。程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。代码:思路分析:设A的长度为a+c,B的长度为b+c,其中c为尾部公共部分的长度,可知a+c+b=b+c+a。① 当访问链表A的指针访问到链表尾部时,令它从链表B的头部重新开始访问链表B;② 当访问链...
2021-09-05 17:22:41
110
原创 剑指Offer35—复杂链表的复制(java版)
题目描述:标签:哈希表 链表请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。代码:思路分析:分三步走:① 复制节点,并连接到每个对应的节点后面② 建立random连接③ 拆分/*// Definition for a Node.class Node { int val; Node next; ..
2021-09-05 17:03:18
87
原创 剑指Offer25—合并两个排序的链表(java版)
题目描述:标签:递归 链表输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。代码:思路分析:递归1、递归结束条件,如果l1链表到尾部了,直接返回l2;如果l2链表到尾部了,直接返回l1。2、如果l1.val <= l2.val,则递归找到l1的下一个连接在哪里,递归结束返回l13、如果l1.val > l2.val,则递归找到l2的下一个连接在哪里,递归结束返回l2/** * Definition for singly-li..
2021-09-05 16:45:48
82
原创 剑指Offer22—链表中倒数第k个节点(java版)
题目描述:标签:链表 双指针输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。代码:思路分析:先循环一遍统计链表中的结点个数,然后在循环遍历到N-k的位置,返回该位置上的结点。/** * Definition for singly-linked list. * pub..
2021-09-05 16:07:11
117
原创 剑指Offer82—删除排序链表中的重复元素Ⅱ(java版)
题目描述:标签:链表 双指针存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中没有重复出现的数字。返回同样按升序排列的结果链表。代码:思路分析:递归1、递归结束调节,如果head == null 或者 head.next == null,说明没有结点或者只有一个结点,直接返回head即可2、定义一个next结点next=head.next,两种情况不同处理:①如果head.val != next...
2021-09-05 15:47:48
162
原创 剑指Offer18—删除链表的结点(java版)
题目描述:标签:链表给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。说明:题目保证链表中节点的值互不相同 若使用 C 或 C++ 语言,你不需要free或delete被删除的节点代码:思路分析:掌握以下删除链表的表达式cur.next = cur.next.next/** * Definition for singly-linked list. * public class ListNode { *...
2021-09-05 15:24:52
77
原创 剑指Offer06—从尾到头打印链表(java版)
题目描述:标签:栈 递归 链表 双指针输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。代码:思路分析:定义一个栈(利用先入后出的特性),用来存放链表节点,然后在pop出来存储结果数组中,就能从尾到头输出节点了/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNod...
2021-09-05 15:16:14
76
原创 剑指Offer58-Ⅱ—左旋转字符串(java版)
题目描述:标签:数学 双指针 字符串字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。代码:思路分析:以n为界限将字符串分为两部分,先将两部分分别翻转,最后再对整个字符串进行翻转。class Solution { public String reverseLeftWords(String s, int n) {...
2021-09-05 15:06:19
135
原创 剑指Offer58-Ⅰ—翻转单词顺序(java版)
题目描述:标签:双指针 字符串输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。说明:无空格字符构成一个单词。输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。代码:思路分析:这题和LeetCode151题翻转字符串里的单词相似。1、..
2021-09-05 14:53:10
255
原创 剑指Offer57-Ⅱ—和为s的连续正数序列(java版)
题目描述:标签:数学 双指针 枚举输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。代码:思路分析:1、定义开始指针strat、结束指针end、以及当前和curSum2、三种情况:①curSum > target,说明需要curSum -= start;且start++②curSum < target,说明需要end++,并且curSum +=...
2021-09-04 22:21:36
119
原创 剑指Offer57—和为s的两个数字(java版)
题目描述:标签:数组 双指针 二分查找输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。代码:思路分析:1、因为数组有序,所以定义双指针left,right分别指向数组头和尾2、处理以下三种情况:①nums[left] + nums[right] = target,返回即可②nums[left] + nums[right] <target,left++③nums[left] + ...
2021-09-04 22:03:21
81
原创 剑指Offer59-Ⅰ—滑动窗口的最大值(java版)
题目描述:标签:队列 滑动窗口 单调队列 堆(优先队列)给定一个数组nums和滑动窗口的大小k,请找出所有滑动窗口里的最大值。代码:思路分析:维护一个大小为k的大顶堆,每次将大顶堆的堆顶加入到list中,这里要注意的是想要移除队列中的某个元素只要使用queue.remove(该元素的值)即可。class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(k ...
2021-09-04 21:54:46
118
原创 剑指Offer41—数据流中的中位数(java版)
题目描述:标签:设计 双指针 数据流 排序 堆(优先队列)如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4]的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double f...
2021-09-04 21:28:31
116
原创 剑指Offer40—最小的k个数(java版)
题目描述:标签:数组 分治 快速选择 排序 堆(优先队列)输入整数数组arr,找出其中最小的k个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。代码:《方法一:快速排序》思路分析:利用快排思想,找到第k-1个位置的下标,然后利用Arrays.copyOf(arr, index+1)用来返回(0~index)的元素。import java.util.Random;class Solution { pr...
2021-09-04 17:41:38
137
原创 剑指Offer31—栈的压入、弹出序列(java版)
题目描述:标签:栈 数组 模拟输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。代码:思路分析:1、用一个栈保存数组,并用一个指针指向poped数组开头,每次push操作后,判断当前栈顶元素是否和poped[j]相同,相同则pop且j++,...
2021-09-03 15:07:36
83
原创 剑指Offer30—包含min函数的栈(java版)
题目描述:标签:栈 设计设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop()—— 删除栈顶的元素。top()—— 获取栈顶元素。getMin() —— 检索栈中的最小元素。代码:思路分析:1、定义两个栈,一个dataStack用来正常存储数据,另一个minStack用来存储每一次push操作当前栈内最小的元素;2、push操作,dataStack正常push,minSta...
2021-09-03 14:51:03
187
原创 剑指Offer09—用两个栈实现队列(java版)
题目描述:标签:栈 设计 队列用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 )代码:思路分析:思路同leetcode232。class CQueue { Deque<Integer> inStack; Deque<Integer> outStack; ...
2021-09-03 14:31:26
114
原创 剑指Offer50—第一个只出现一次的字符(java版)
题目描述:标签:队列 哈希表 字符串 计数在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。代码:思路分析:先用hashmap统计每个字符的个数,然后再循环一次,找到只出现1次的第一个字符。class Solution { public char firstUniqChar(String s) { Map<Character, Integer> map = new HashMap<&...
2021-09-03 12:10:07
147
原创 剑指Offer29—顺时针打印矩阵(java版)
题目描述:标签:数组 矩阵 模拟输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。代码:思路分析:思路同leetcode59螺旋矩阵。class Solution { public int[] spiralOrder(int[][] matrix) { if(matrix == null || matrix.length == 0 || matrix[0].length == 0){ return new i...
2021-09-03 11:58:12
75
原创 剑指Offer04—二维数组中的查找(java版)
题目描述:标签:数组 二分查找 分治 矩阵在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。代码:思路分析:线性查找1、利用二维数组的特点,从右上角开始查找,它左边的元素都小于当前元素,它下边的元素都大于当前元素;2、令row=0,col=m-1,从右上角开始查找,如果matrix[row][col]==target,则返回true;如...
2021-09-03 11:05:45
159
原创 剑指Offer03—数组中重复的数字(java版)
题目描述:标签:数组 哈希表 排序找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。代码:思路分析:用set的不重复性,每次利用set保存数字前。先用contains()方法判断是否存在该数,如果存在则输出该数(说明该数重复)class Solution { public int findRepea...
2021-09-02 20:00:55
66
原创 LeetCode25—K个一组翻转链表(java版)
题目描述:标签:递归 链表给你一个链表,每k个节点一组进行翻转,请你返回翻转后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。进阶:你可以设计一个只使用常数额外空间的算法来解决此问题吗?你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。代码:思路分析:1、将链表分为三个部分,已翻转--待翻转--未翻转。2、定义start和end来指向待翻转部分的开头结点和末尾结点,并定...
2021-09-02 19:51:28
363
1
原创 LeetCode504—七进制数(java版)
题目描述:标签:数学给定一个整数num,将其转化为7 进制,并以字符串形式输出。代码:思路分析:1、利用了StringBuffer的insert()方法,可以在指定位置插入元素(这样就可以不用反转了)2、将每次取余的数num%7添加至sb的头部,并将该数变为num/7class Solution { public String convertToBase7(int num) { if(num == 0){ retu...
2021-09-01 21:43:07
201
原创 LeetCode204—计数质数(java版)
题目描述:标签:数组 数学 枚举 数论统计所有小于非负整数n的质数的数量。代码:思路分析:暴力循环会超时,这里采用了埃及筛方法。1、定义一个prime数组,长为n,每个初始值为1,这个数组中1代表是质数,0代表不是质数2、如果一个数x是质数,那它的倍数2x、3x、...等肯定不是质数,筛除掉3、再优化就是x*x开始筛选,因为 k < x的倍数已经别筛选掉了。class Solution { public int countPrimes(in...
2021-09-01 21:20:32
112
原创 UT单元测试(三)——PowerMock篇
一、PowerMock简介Mockito框架虽然解除了外部资源的依赖,能提高测试用例的运行速度和效率,但是仍然有自己的局限性,比如不能对final、private、static方法进行mock。PowerMock是在其他Mock框架的基础上做了扩展,解决了它们的局限性,实现了额外的功能。二、PowerMock环境设置在应用PowerMock之前需要在build.gradle文件中添加相应的依赖:三、PowerMock的使用 PowerMock的使用步骤 ..
2021-08-30 17:19:39
866
原创 UT单元测试(二)——Mockito篇
一、Mockito简介在单元测试开发中,经常会遇到测试的类中有很多依赖的类、对象、资源,从而形成巨大的依赖树,mock可以模拟外部依赖,适应单元测试。比如在开发中很容易出现这种情况:(a)依赖(b)依赖(c)依赖(d)这种情况下单元测试就变得极其复杂,比如需要数据库或网络请求返回值的情况。因此需要引入Mockito让单元测试变得简单,可以通过mock虚拟外部依赖,并可以通过打桩操作轻松地修改返回值甚至抛出异常:(a)依赖(mock b)二、Mockito环境设置在应用Mock
2021-08-30 17:17:37
1416
原创 UT单元测试(一)——基础流程总结篇
参考书籍《单元测试的艺术》一、单元测试的定义一个单元测试是一段代码(通常是一个方法),这段代码调用另一段代码(一个单元可以是一个方法或函数),然后检验某些假设的正确性。如果这些假设是正确的,单元测试就成功了,反之单元测试就失败了。二、单元测试的价值(1)帮助发现代码缺陷;(2)修改或重构代码时确保不会影响现有功能;三、单元测试书写步骤(1)在目录下先新建对应测试代码的test包,使之与测试项目有相同的子目录;(2)导入Jnuit测试包;(3)找到要测试的类对..
2021-08-30 17:15:31
5598
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人