![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
ChaoticNg
八股文颂唱者
展开
-
JZ33 丑数
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。示例1输入7返回值8丑数能够分解成2^x3^y5^z,所以只需要把得到的丑数不断地乘以2、3、5之后并放入他们应该放置的位置即可,而此题的难点就在于如何有序的放在合适的位置。1乘以 (2、3、5)=2、3、5;2乘以(2、3、5)=4、6、10;3乘以(2、3、5)=6,9,原创 2021-02-22 10:01:20 · 166 阅读 · 0 评论 -
JZ32 把数组排成最小的数 Java
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。示例输入[3,32,321]返回值"321323"比较两个字符串s1, s2大小的时候,先将它们拼接起来,比较s1+s2,和s2+s1哪个大,如果s1+s2大,那说明s2应该放前面。public class Main { public static void mai..原创 2021-01-26 10:39:19 · 123 阅读 · 0 评论 -
JZ5 用两个栈实现队列 Java
1. push(),stack2入栈时如果stack1不为空,则把stack2的元素pop()到stack1;stack2为空就直接push进去。2.pop(),stack2出栈时如果stack1不为空,则把stack1的元素先pop()到stack2,这样stack2再push()的话元素就是先进先出;stack2为空就直接pop出去。总之就是stack2用来抛元素,stack1用来倒序。 import java.u...原创 2020-09-23 09:29:00 · 91 阅读 · 0 评论 -
JZ3 从尾到头打印链表 Java
3->5->6->9public class JZ3 { public static void main(String[] args) { ListNode head = new ListNode(3); ListNode node2 = new ListNode(5); ListNode node3 = new ListNode(6); ListNode node4 = new ListNode(9);.原创 2020-08-25 09:37:02 · 169 阅读 · 0 评论 -
JZ18 二叉树的镜像 Java
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。思路:不要想得太多反而想复杂了,其实就把每个左右节点调换即可。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solutio.原创 2020-10-28 10:32:06 · 257 阅读 · 0 评论 -
队列实现栈 java
栈的特性是后进先出。栈的主要操作是出栈入栈。队列的特性是先进先出。队列的主要操作是队尾追加元素,是队首取出元素。要用队列实现栈,那么需要两个队列,一个正式队列,一个预备队列。正式队列相当于栈,用来存储入栈的元素;预备队列用来在出栈的时候,将队首到队尾前一个元素进行临时存储,待出栈操作完成后,再将预备队列中的元素取出放到正式队列中。public class StackByQueue { public static void main(String[] args) {..原创 2021-05-19 17:24:21 · 85 阅读 · 0 评论 -
JZ17 树的子结构 Java
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路判断当前节点的val是否相等,不相等就用A树的所有子节点比。如果碰到相等的,就再比较当前的和B当前的节点以及子节点是否相等(递归)。其中isEquals前面两个判断null,第一个是假如B树遍历结束了依旧没有返回false,则表明全部相等,true;第二个if是B树还没遍历完,但A树结束了,肯定就是false。这两个递归太优雅了,给跪。。。/**public class T.原创 2020-10-28 09:30:39 · 351 阅读 · 0 评论 -
JZ36 两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)说明:本题目包含复杂数据结构ListNode题解题目抽象:给定两个单链表A,B,假设一定含有公共结点,返回第一个公共结点的指针。方法:双指针法假如例子如下:显然第一个公共结点为8,但是链表A头结点到8的长度为2,链表B头结点到8的长度为3,显然不好办?如果我们能够制造一种理想情况,如下:这里先假设链表A头结点与结点8的长.原创 2021-02-18 11:12:48 · 76 阅读 · 0 评论 -
JZ37 数字在升序数组中出现的次数 Java
题目描述统计一个数字在升序数组中出现的次数。示例1输入[1,2,3,3,3,3,4,5],3返回值4先二叉搜索找一下这个元素的位置,然后再前后遍历计数一下import java.util.*;public class Solution { public int GetNumberOfK(int [] array , int k) { int index = Arrays.binarySearch(array, k); ..原创 2021-02-22 09:26:13 · 134 阅读 · 0 评论 -
JZ12 数值的整数次方 Java
public class Solution { public double Power(double base, int exponent) { // 当底数为0,指数为负数时,则抛出异常或者返回0.0 if (equal(base, 0) && exponent < 0) { return 0.0; } // 先对指数进行取绝对值计算 int absExponent .原创 2020-10-12 09:13:50 · 97 阅读 · 0 评论 -
JZ30 连续子数组的最大和 Java
题目描述输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).示例输入[1,-2,3,10,-4,7,2,-5]返回值18说明输入的数组为{1,-2,3,10,—4,7,2,一5},和最大的子数组为{3,10,一4,7,2},因此输出为该子数组的和 18。 典型的动态规划。dp[n]代表以当前元素为截止点的连续子序列的最大和,如果dp[n-1]>0,dp[n].原创 2021-01-21 09:18:55 · 84 阅读 · 0 评论 -
JZ20 包含min函数的栈 Java
一、题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。二、问题分析刚看到这个题的时候不太懂这道题的目的是什么,定义栈的数据结构,拿Java来说,utils包下不是有Stack栈的定义吗?再一看是要实现找到栈中最小元素的min函数。这下清楚了,原来是对栈数据结构的改进,自然而然想到只需要定义一个min()函数,然后遍历完栈找到最小值返回,但是之后看别原创 2020-11-05 09:04:22 · 102 阅读 · 0 评论 -
JZ28 数组中出现次数超过一半的数字 Java
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。示例输入[1,2,3,2,2,2,5,4,2]返回值2import java.util.*;public class Solution {//1、hashmap法,缺点是比较浪费空间public int MoreThanHalfNum_Solu原创 2021-01-05 09:48:00 · 139 阅读 · 0 评论 -
JZ6 旋转数组的最小数字 Java
二分法需要考虑的情况较多mid = (left + right)/2(1)array[mid] > array[right]出现这种情况的array类似[3,4,5,6,1,2],此时最小数字一定在mid的右边。left = mid + 1(2)array[mid] == array[high]出现这种情况的array类似[2,1,2,2,2]或者[2,2,2,1,2],此时最小数字不好判断在mid左边还是右边,这时只好一个一个试right =...原创 2020-09-27 09:07:43 · 100 阅读 · 0 评论 -
JZ8 跳台阶 Java
public class Solution { public int JumpFloor(int target) { if(target<3){ return target; }else return JumpFloor(target-1)+JumpFloor(target-2); }}和上一题一样也是递归,当n阶台阶时,因为一次值能跳一步或者两步,往前一个步骤可能的情况只有“台阶数为n-1”+“台阶数为n-2”的情况。逐.原创 2020-10-10 09:06:11 · 135 阅读 · 0 评论 -
JZ16 合并两个排序的链表 Java
/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode Merge(ListNode list1,ListNode list2) { //1-->3-->6 //2-->4...原创 2020-10-27 16:45:57 · 108 阅读 · 0 评论 -
JZ29 最小的K个数 Java
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。示例输入[4,5,1,6,2,7,3,8],4返回值[1,2,3,4]import java.util.*;public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { .原创 2021-01-05 14:54:58 · 148 阅读 · 0 评论 -
JZ2 替换空格 Java
如果希望不占用额外的内存空间,只是在原字符串上进行替换操作的话,因为被替换的字符数更多,所以从前往后遍历,会发生覆盖,为了避免覆盖的发生,每次替换就要将后面的所以字符向后移动2个单位,时间复杂度为o(n^2)。如果从后往前遍历,则不用多次移动,只需一次即可,时间复杂度为o(n)。public static String replaceSpace(StringBuffer str) { int l = str.length()-1; for (int i=0;i<=l;i+.原创 2020-08-25 09:35:04 · 91 阅读 · 0 评论 -
JZ34 第一个只出现一次的字符
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)示例1输入"google"返回值4public class Solution { public int FirstNotRepeatingChar(String str) { if(str == null || str.length() == 0)ret.原创 2021-02-18 09:48:36 · 86 阅读 · 0 评论 -
JZ25 复杂链表的复制 Java
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) RandomListNode 1 2...原创 2020-12-30 14:34:30 · 124 阅读 · 0 评论 -
JZ13 调整数组顺序使奇数位于偶数前面 Java
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。[1,2,3,4,5,6] --> [2,4,6,1,3,5]方法一:借用插入排序法,两层遍历,如果当前数为奇数而前面为偶数,则调换顺序;public class Solution { public void reOrderArray(int [] array) { //插入排序法.原创 2020-10-13 16:28:48 · 180 阅读 · 0 评论 -
JZ7 斐波那契数列 Java
public class Solution { public int Fibonacci(int n) { int m=0; if(n<2){ m=n; }else{ m=Fibonacci(n-1)+Fibonacci(n-2); } return m; }}最经典的递归原创 2020-10-10 08:55:51 · 137 阅读 · 0 评论 -
JZ19 顺时针打印矩阵 Java
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.示例1输入[[1,2],[3,4]]返回值[1,2,4,3]能看懂但写不出来系列。。。别人的答案public class Solution { public ...原创 2020-11-03 09:30:56 · 191 阅读 · 0 评论 -
JZ1 二维数组中的查找 Java
给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。解题思路时间复杂度 O(M + N),空间复杂度 O(1)若逐行或逐列用二分法遍历,效率太慢了,我们希望可以以对角线的方向去遍历,对角线方向有4种:1. 从左上角向右下角出发:往左往下的数都是比当前大的,不可用二分法,放弃;2.从右上角向左下角出发:往左的数变小,往下的数增大,可用二分法;3. 从左下角向右上角出发:往上的数变小,往右的数增大,可用二...原创 2020-08-25 09:34:00 · 143 阅读 · 0 评论 -
JZ15 反转链表 Java
public static Node reverseList(Node node) { Node pre = null; Node next = null; while (node != null) { next = node.next; node.next = pre; pre = node; node = next; } return pre;}原创 2020-10-26 14:42:07 · 117 阅读 · 0 评论 -
JZ22 从上往下打印二叉树 Java
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。牛客网的输入示例有点误导人,不看就好了。分析这道题实质上考察的就是树的遍历算法,只是这种遍历不是我们熟悉的前序、中序或者后序遍历。由于我们不太熟悉这种按层遍历的方法,可能一下也想不清楚遍历的过程。因为按层打印的顺序决定应该先打印的根节点,所以我们从树的根节点开始分析。为了接下来能够打印8的节点的两个子节点,我们应该在遍历到该节点时把值为6和10的两个节点保存到一个容器中,现在容器内就有两个节点了。按照从左到右打印的要..原创 2020-11-18 09:03:53 · 99 阅读 · 0 评论 -
JZ9 变态跳台阶 Java
关于贪心算法:原创 2020-10-10 09:20:00 · 200 阅读 · 0 评论 -
JZ10 矩形覆盖 Java
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:public class Solution { public int RectCover(int target) { if(target<3){ return target; }else{ return RectCover(ta原创 2020-10-10 15:11:35 · 95 阅读 · 0 评论 -
JZ11 二进制中1的个数 Java
题目描述输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。解析:n&(n-1) ,该位运算是去除 n 的位级表示中最低的那一位。n : 10110100 n-1 : 10110011 n&(n-1) : 10110000即和(n-1)与操作,每次消除一个1,就计数,直到全部为0。public class Solution { public int NumberOf1(int n){ int...原创 2020-10-10 15:52:00 · 101 阅读 · 0 评论 -
JZ21 栈的压入、弹出序列 Java
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路模拟堆栈操作的过程,将原数列依次压栈,把栈顶元素与所给出栈队列相比,如果相同则出栈,如果不同则继续压栈,直到原数列中所有数字压栈完毕。最后,检测栈中是否为空,若空,说明出栈队列可由原数列原创 2020-11-17 09:29:13 · 102 阅读 · 0 评论 -
JZ14 链表中倒数第k个结点 Java
/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode FindKthToTail(ListNode head,int k) { //5-->2-->3-->4-->1--7>...原创 2020-10-26 13:57:33 · 103 阅读 · 0 评论 -
【经典数据结构】B树与B+树的对比区别
维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在数据库和文件系统。”定义B 树可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点。根节点至少原创 2021-03-09 16:41:45 · 19720 阅读 · 1 评论 -
Java实现几种排序算法:冒泡排序,插入排序,选择排序,快速排序,希尔排序 ,堆排序 ,归并排序
目录1.冒泡排序2.快速排序3.直接插入排序4.希尔排序5.简单选择排序6.堆排序7.归并排序8.常见排序算法效率比较 1.冒泡排序遍历每个数,每轮把最大的排到最后 package sorting_algorithm;import java.util.Arrays;/** * Cre...原创 2019-03-27 15:36:02 · 525 阅读 · 1 评论 -
二叉树
1、二叉搜索树(Binary Search Tree)又名二叉排序树、二叉查找树。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。二叉搜索树是具有有以下性质的二叉树:(1)若左子树不为空,则左子树上所有节点的值均小于或等于它的根节点的值(2)若右子树不为空,则右子树上所有节点的值 均大于或等于它的根节点的值(3)左、右子树也分别为二叉搜索树..原创 2020-12-21 08:48:33 · 96 阅读 · 0 评论 -
贪心算法简介
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解例如,平时购物找零钱时,为使找回的零钱的硬币数最少,不要求找零钱的所有方案,而是从最大面值的币种开始,按递减的顺序考虑各面额,先尽量用大面值的面额,当不足大面值时才去考虑下一个较小面值,这就是贪心算法。贪心算法可解决的问题通常大部分都有如下的特性:1、有一个以最优方式来解决的问题。为了构造问题的解决方案,有一个候选的对象的集合:比如不同面..原创 2020-10-10 09:20:49 · 452 阅读 · 1 评论