
数据结构和算法
文章平均质量分 84
数据结构的集合框架以及一些算法题目
烟雨、相思醉
努力不需要借口,一无所有就是拼的理由
展开
-
二叉树展开为链表
题目描述给定一个二叉树,原地将它展开为一个单链表。例如,给定二叉树 1 / \ 2 5 / \ \3 4 6将其展开为:1 \ 2 \ 3 \ 4 \ 5 \ 6算法思想第一种:先把左子树排好,然后将左子树加到根节点的右节点上,再把右子树接到排好的左子树上,最后对右子树进行排序。第二种:把左子树和右子树排好了,然后将左子树接到根节点原创 2020-08-03 01:35:51 · 459 阅读 · 0 评论 -
给定两个 int 变量, 不使用临时变量,交换两个变量的值.
import java.util.Scanner;public class Test{ public static void main(String[] args){ Scanner input=new Scanner(System.in); System.out.print("Enter two numbers:"); int number1=input.nextInt...原创 2019-10-10 19:02:20 · 228 阅读 · 0 评论 -
在单链表中寻找倒数第k个结点
思路:定义快慢指针,先让快的走k-1步,然后快慢一起走,等快的走完,慢的就走到了倒数第k个节点。 public ListNode findKthToTail(int k){ if(k<0){ return null; } ListNode fast=this.head; ListNode slow=th...原创 2019-11-02 17:42:04 · 246 阅读 · 1 评论 -
单链表的逆置
定义一个cur,循环遍历单链表,curNext标记它的下一个节点,newHead标记反转后单链表的头结点 public ListNode reverseList(){ ListNode pre=null; ListNode newHead=null; ListNode cur=this.head; while(cur!=null)...原创 2019-11-02 22:18:23 · 252 阅读 · 0 评论 -
复杂链表的复制
假设复制后的链表如下:思路如下:1.将新老节点串起来2.解决random指向3.把新老链表节点拆开class Solution{ public Node copyRandomList(Node head){ if(head==null){ return null; } //1.将新老节点串为一个链表...原创 2019-11-11 19:42:37 · 129 阅读 · 1 评论 -
解析汉诺塔问题
问题描述:有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方 ,一次只能移动一个盘子。算法思想:当有一个盘子时,只用把那一个盘子从A移动到C上,当有n个盘子时,先把n-1个盘子从A移动到B上,然后再把最后一个盘子从A移到C上,最后再把那n-1个盘子移动到C上。Jav...原创 2019-11-12 17:27:58 · 460 阅读 · 0 评论 -
解决旋转链表问题
LeetCode题目:给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。示例 1:输入: 1->2->3->4->5->NULL, k = 2输出: 4->5->1->2->3->NULL解释:向右旋转 1 步: 5->1->2->3->4->NULL向右旋转 2 步...原创 2019-11-18 20:29:24 · 189 阅读 · 1 评论 -
合并k个有序单链表
LeetCode题目合并 k 个排序链表,返回合并后的排序链表。示例:输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4->4->5->6算法思想1.先考虑一个单链表和两个单链表合并的情况2.将整个单链表数组每次从中间分割,直至每个数组里有一个或两个单链表,然后合并(分...原创 2019-11-18 20:46:20 · 313 阅读 · 0 评论 -
解决删除排序链表中的重复元素的问题
LeetCode题目给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。示例 :输入: 1->2->3->3->4->4->5输出: 1->2->5算法思想1.创建一个虚拟结点,将所有不重复的节点连接在后面2.定义cur遍历单链表,判断当前结点与下一结点数字是否相同3.返回新的单链表代码class...原创 2019-11-19 10:38:12 · 243 阅读 · 1 评论 -
牛客题目:在数组中找出出现次数大于一半的数
题目描述给定一个整型数组arr,请打印其中出现次数大于一半的数,如果没有这样的数,请输出-1。示例输入:511 7 5 7 7输出:7算法思想1.给数组进行排序2.定义count计数字出现的次数,遍历数组,从数组第一个数开始与最中间的数进行比较,若相等,则count每次加13.若count的值大于数组最中间的数字下标,则输出最中间的数字,否则输出-1。代码import j...原创 2019-12-16 16:11:14 · 1348 阅读 · 1 评论 -
如何用栈实现队列以及用队列实现栈
用桟实现队列算法思路1.入队列:将元素放置到s1中2.出队列:检测s2是否为空,若为空,将s1中的元素搬移到s2中,删除s2栈顶的元素;若不为空,则删除s2栈顶的元素3.获取队头元素:检测s2是否为空,若为空,将s1中元素搬移到s2中;若不为空,则从s2栈顶直接获取4.检测队列是否为空:若两个栈都为空,则队列为空Java代码class MyQueue { private S...原创 2020-02-11 21:30:57 · 346 阅读 · 2 评论 -
面试题:ArrayList和LinkedList
ArrayList的相关知识底层实现原理(1)ArrayList是一个动态类型的顺序表,它完全实现了List的全部接口功能,是基于数组实现的List类,内部封装了一个Object[]类型的数组,长度可以动态增长;(2)如果在创建时没有指定长度,他默认创建了一个长度为10的数组,当新添加的元素已经没有位置存放的时候,ArrayList会自动扩容,扩容后的长度为原来的1.5倍;(3)支持随机访...原创 2020-02-18 18:11:33 · 254 阅读 · 1 评论 -
利用ArrayList进行的洗牌算法
算法思想先构造一副扑克牌;利用for循环从后往前依次取牌 i;从[0,i]用Random函数随机取一张扑克牌j;将i与j位置上的牌进行交换。Java代码import java.util.ArrayList;import java.util.List;import java.util.Random;class card{ private String suit; ...原创 2020-02-21 21:05:42 · 361 阅读 · 1 评论 -
使用ArrayList解决杨辉三角问题
题目描述给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。算法思想用for循环创建numRows个动态链表,代表杨辉三角的前numRows行;设置变量i和j,分别代表行和列,因为第0列和对角线数据为1,所以将j为0和j与i相等的位置设为1;设置其他位置:当前位置=前一行正对数据与前一个数据的和。注意:在使用se...原创 2020-02-21 21:24:39 · 427 阅读 · 1 评论 -
Java中的栈和队列
栈概念栈(stack)是一种只允许在一端进行插入和删除的特殊线性表结构,进行数据插入和删除的一端叫栈顶,另一端则是栈底。特性先进后出栈的实现class MyStack<E>{ private E[] array =(E[]) new Object[100]; private int size = 0; public void push(E e)...原创 2020-02-22 23:18:29 · 396 阅读 · 2 评论 -
逆波兰表达式的求值问题
题目描述根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。算法思想遍历字符串,若为数字就入栈,若为运算符,则将数字出栈进行运算Java代码public int evalRPN(String[] tokens) { Stack<Integer> s = new Stack<>...原创 2020-02-24 22:16:53 · 150 阅读 · 0 评论 -
如何高效的判断素数
题目描述给定一个数字,判断该数是否为素数算法思路采用循环,若一个数不为素数,则它一定可以有两个数相乘得到,其中一个数大于等于它的平方根,另一个则小于它的平方根,所以用该数去对2到它的平方根取余,若能整除,则不为素数Java代码import java.util.Scanner;import java.lang.Math;public class IsPrime { public...原创 2020-03-01 21:47:14 · 242 阅读 · 0 评论 -
关于数据结构中的二叉树
树的概念二叉树原创 2020-03-08 22:42:28 · 197 阅读 · 0 评论 -
如何判断一棵树是否为完全二叉树
题目描述完全二叉树总共有k层,前k-1层节点肯定是饱和的(达到了最大值),前k-2层中每个节点都有2个孩子,第k-1层节点不一定所有的节点都有孩子节点,如果有孩子节点,至少要是左孩子节点算法思路按层序遍历,找到第一个不饱和节点(1.只有左孩子2.只有右孩子3.没有孩子);从该节点之后所有节点不能有孩子,如果有孩子,一定不是完全二叉树;如果某个节点只有右孩子没有左孩子,则一定不是完全二叉...原创 2020-03-11 17:28:17 · 1945 阅读 · 0 评论 -
Java中优先级队列的基本知识
概念队列(PriorityQueue)是一种先进先出的数据结构,但是有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出队列。在这种情况下,数据结构提供了两个最基本的操作,一个返回最高优先级对象,一个是添加新的对象,这种数据结构就是优先级队列。PriorityQueue是线程不安全的,而PriorityBlockingQueue是线程安全的。注意:1.使用前必须先...原创 2020-03-23 22:23:32 · 629 阅读 · 0 评论 -
Java中七大基于比较的排序算法
目录插入排序直接插入排序基本原理代码实现性能分析折半插入排序代码实现希尔排序基本原理代码实现性能分析选择排序单向选择排序基本原理代码实现性能分析双向选择排序代码实现堆排序基本原理代码实现性能分析冒泡排序基本原理代码实现性能分析快速排序基本原理代码实现(递归和非递归)性能分析归并排序基本原理代码实现性能分析排序总结各种排序算法之间的比较插入排序直接插入排序基本原理整个区间分为两部分:有序区...原创 2020-04-10 12:55:12 · 1346 阅读 · 1 评论 -
牛客题目:实现超长正整数相加
题目描述请设计一个算法完成两个超长正整数的加法。输入描述:输入两个字符串数字输出描述:输出相加后的结果,string型算法思想用两个字符数组分别逆序存储两个字符串所表示的整数;遍历前面两个数组,按位相加, 用比前面两个字符数组中最大的字符数组还大一点的数组保存结果,多出来的一位保存是否进位;如果结果数组的最后一个元素为1,则表示有进位,把数组逆序转为String;若为0,则表示...原创 2020-04-13 10:40:11 · 435 阅读 · 0 评论 -
非基于比较的排序——计数排序
计数排序题目描述算法描述Java代码题目描述有n个数,取值集中在某个范围,写出一个排序算法,要求时间复杂度和空间复杂度都是O(n)的。算法描述统计元素的范围开辟计数的空间统计每个元素出现的次数对元素进行回收——排序Java代码 public static void countSort(int[] array){ //1.统计元素的范围 i...原创 2020-05-01 17:18:50 · 340 阅读 · 0 评论 -
看完你觉得你真的了解Map吗
HashMap相关知识Map的说明Map的两种实例化方式HashMapTreeMapMap的说明Map是一个接口类,该类没有继承自Collection,该类中存储的是<k,v>结构的键值对,并且k一定是唯一的,不能重复。Map.Entry<K, V> 是Map内部实现的用来存放<key, value>键值对映射关系的内部类注意:Map是一个接口,...原创 2020-05-03 11:26:05 · 487 阅读 · 0 评论