数据结构与算法
数据结构与算法学习笔记
柚咖
这个作者很懒,什么都没留下…
展开
-
刷题目录
链表来源题目题解剑指Offer 22题链表中倒数第K个节点题解原创 2021-03-21 02:01:25 · 170 阅读 · 0 评论 -
SDUT —— 汉诺塔
1200 - 汉诺塔Description汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒A、B和C,A上面套着n个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从A棒搬到C棒上,规定可利用中间的一根B棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。僧侣们搬得汗流满面,可惜当n很大时这辈子恐怕就很搬完了。聪明的你还有计算机帮你完成,你能写一个程序帮助僧侣们完成这辈子的夙愿吗?Input输入金片的个原创 2021-08-30 15:51:57 · 362 阅读 · 0 评论 -
SDUT—— 约瑟夫问题
约瑟夫问题Descriptionn个人想玩残酷的死亡游戏,游戏规则如下:n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。请输出最后一个人的编号。Input输入n和m值。Output输出胜利者的编号。SampleInput5 3Output4Hint第一轮:3被杀第二轮:1被杀第三轮:5被杀第四轮:2被杀#include<stdio.h>#include<stdlib.h>原创 2021-08-18 14:32:39 · 291 阅读 · 0 评论 -
SDUT —— 计算组合数
计算组合数Description计算组合数。C(n,m),表示从n个数中选择m个的组合数。计算公式如下:若:m=0,C(n,m)=1否则, 若 n=1,C(n,m)=1否则,若m=n,C(n,m)=1否则 C(n,m) = C(n-1,m-1) + C(n-1,m).Input第一行是正整数N,表示有N组要求的组合数。接下来N行,每行两个整数n,m (0 <= m <= n <= 20)。Output输出N行。每行输出一个整数表示C(n,m)。SampleInp原创 2021-08-17 15:06:48 · 1092 阅读 · 0 评论 -
SDUT —— 因式分解
因式分解Description将大于1的自然数N进行因式分解,满足N=a1a2a3…am。编一程序,对任意的自然数N(1< N<=2,000,000,000),求N的所有形式不同的因式分解方案总数。如N=12,共有8种分解方案,他们分别是:12=1212=6212=4312=3412=32212=2612=23212=22*3Input输入只有一行,一个整数N。Output输出只有一行,一个整数表示自然数N的因式分解方案总数。SampleInput12Ou原创 2021-08-17 14:52:13 · 218 阅读 · 0 评论 -
数据结构实验之链表三:链表的逆置
数据结构实验之链表三:链表的逆置Description: 输入多个整数,以-1作为结束标志,顺序建立一个带头结点的单链表,之后对该单链表的数据进行逆置,并输出逆置后的单链表数据。Input: 输入多个整数,以-1作为结束标志。Output: 输出逆置后的单链表数据。Sample: Input 12 56 4 6 55 15 33 62 -1 Output 62 33 15 55 6 4 56 12Hint: 不得使用数组。 根据输入顺序建立链表,然后利用回归原创 2021-08-17 11:27:09 · 941 阅读 · 0 评论 -
SDUT —— 数据结构实验之串三:KMP应用
Problem Description有n个小朋友,每个小朋友手里有一些糖块,现在这些小朋友排成一排,编号是由1到n。现在给出m个数,能不能唯一的确定一对值l和r(l <= r),使得这m个数刚好是第l个小朋友到第r个小朋友手里的糖块数?Input首先输入一个整数n,代表有n个小朋友。下一行输入n个数,分别代表每个小朋友手里糖的数量。之后再输入一个整数m,代表下面有m个数。下一行...原创 2018-05-27 11:29:07 · 556 阅读 · 0 评论 -
SDUT 整理音乐 链表
Input 输入数据第一行为一个整数n(n<1000),代表文件夹的数量。接下来是n个文件夹的信息,每个文件夹信息的第一行是一个数字m(m<=10000),代表这个文件夹里有m首歌,后面m行每行一个歌曲名、分数,之间用空格分开。歌曲名称不超过5个字符。Output 输出一行,为所有音乐组成的一个序列,音乐只输出名字。如果音乐分数相同则按照音乐名字典序进行排序。Sampl...原创 2018-03-20 20:32:12 · 257 阅读 · 0 评论 -
SDUT —— 三国佚事---巴蜀之危
Problem Description话说天下大势,分久必合,合久必分。。。却道那魏蜀吴三国鼎力之时,多少英雄豪杰以热血谱写那千古之绝唱。古人诚不我欺,确是应了那句“一将功成万骨枯”。 是夜,明月高悬。诸葛丞相轻摇羽扇,一脸愁苦。原来是日前蜀国战事吃紧,丞相彻夜未眠,奋笔急书,于每个烽火台写下安排书信。可想,这战事多变,丞相运筹 帷幄,给诸多烽火台定下不同计策,却也实属不易。谁成想这送信小...原创 2018-05-31 21:12:51 · 388 阅读 · 0 评论 -
SDUT —— 爬山
Problem DescriptionLeiQ最近参加了一个登山俱乐部,部长给他了一个n*m地图,地图上的每一个格子的值表示一个山的海拔高度,LeiQ现在在(x,y)表示在地图上的位置,他想要登上地图上最高的山,所以他想知道他爬上最高的山的山顶还需向上爬多少米。例如:x\y 1 2 31 100 130 1502 200 300 1003 100 150 50现在LeiQ...原创 2018-03-19 19:34:50 · 1426 阅读 · 0 评论 -
SDUT —— 骨牌铺方格
Problem Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图: Input 输入数据由多行组成,每行包含一个整数n,表示该测试实例的长方形方格的规格是2×n (0< n<=50)。 Output 对于每个测试实例,请输出铺放方案的总数,每个实例...原创 2018-03-22 19:47:38 · 290 阅读 · 0 评论 -
SDUT —— 折线分割平面
题目我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。 Input 输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0&lt; n&lt;=10000),表示折线的数量。 Output 对于每个测试实例,请...原创 2018-03-22 21:55:08 · 245 阅读 · 0 评论 -
素数判断
最基础的方法package is_primer;import java.util.Scanner;public class Basis { public static void main(String[] args) { Scanner s = new Scanner(System.in); int n = s.nextInt(); ...原创 2018-03-23 22:27:18 · 143 阅读 · 0 评论 -
求GCD和LCM
GCD辗转相除法求最大公因数 对于两个数a,b来说,如果a > b,有 a = q*b + r,则(a, b)=(b, r);一直重复下去知道r等于0,则最后一个不为0的r就是(a, b)package GCD_and_LCM;import java.util.Scanner;//从键盘上输入数据public class GCD { static int Gcd (i...原创 2018-03-23 22:29:55 · 674 阅读 · 0 评论 -
多项式求和
Problem Description 多项式描述如下: 1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 …… 先请你求出多项式前n项的和。 Input 第一行输入一个数T代表测试数据个数(T<=1000)。接下来T行每行1个数代表n(0<=n< 2^31)。 Output 对于每个输入样例,输出多项式和的结果(结果精确到小数点后两位)。每行输出...原创 2018-04-07 23:43:40 · 1125 阅读 · 0 评论 -
数据结构实验之栈与队列二:一般算术表达式转换成后缀式
Problem Description对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。Input输入一个算术表达式,以‘#’字符作为结束标志。Output输出该表达式转换所得到的后缀式。Sample Inputa*b+(c-d/e)*f#Sample Outputab*cde/-f*+HintSource关于后缀表达式相关知识见算术表达式和后缀表达式转换...原创 2018-04-11 22:17:56 · 167 阅读 · 0 评论 -
数据结构实验之队列一:排队买饭遇到的函数传值问题
数据结构实验之队列一:排队买饭 Problem Description 中午买饭的人特多,食堂真是太拥挤了,买个饭费劲,理工大的小孩还是很聪明的,直接奔政通超市,哈哈,确实,政通超市里面也卖饭,有好几种菜,做的比食堂好吃多了,价格也不比食堂贵,并且买菜就送豆浆,吸引了不少童鞋。所以有时吧,人还是很多的,排队是免不了的,悲剧的是超市只有两个收银窗口。问题是这样的:开始有两队人在排队,现在咱们...原创 2018-04-17 22:00:26 · 471 阅读 · 1 评论 -
1482 —— 二元多项式
二元多项式Problem Description给你多个二元多项式和一个操作符,让你输出操作符操作这些二元多项式之后的结果。Input首先输入二元多项式的个数n和操作符号(‘+’,‘*’);后面n行输入每一个多项式。多组输入,当n=0的时候结束输入。(n<5,二元多项式的长度小于1000,二元多项式都是由x,y,^,数字,’+’组成的)Output输出操作...原创 2018-05-24 17:39:49 · 1052 阅读 · 0 评论 -
数据结构实验之栈与队列七:出栈序列判定
数据结构实验之栈与队列七:出栈序列判定Problem Description给一个初始的入栈序列,其次序即为元素的入栈次序,栈顶元素可以随时出栈,每个元素只能入栈依次。输入一个入栈序列,后面依次输入多个序列,请判断这些序列是否为所给入栈序列合法的出栈序列。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个出栈序列,但4,3,5,1,2就不可能是该...原创 2018-04-15 23:10:43 · 1467 阅读 · 0 评论 -
数据结构实验之栈与队列:下一较大值
题一:处理小于等于1000的数据数据结构实验之栈与队列五:下一较大值(一) Problem Description 对于包含n(1&lt;=n&lt;=1000)个整数的序列,对于序列中的每一元素,在序列中查找其位置之后第一个大于它的值,如果找到,输出所找到的值,否则,输出-1。Input 输入有多组,第一行输入t(1&lt;=t&lt;=10),表示输入的组数;以后是 t 组...原创 2018-04-15 20:20:46 · 472 阅读 · 0 评论 -
最终排序
Problem Description 第四届山东理工大学ACM网络编程擂台赛比赛完后需要产生一个最终排名,排名按照题数多少来决定。但是有太多的队伍参与,手动计算排名已经不能满足比赛的需求。现在有一份名单记录各个队伍的ID和做出的题目数,需要你写一个程序,产生最终的排名。为了简化题目,这里的排名规则为:做出题目数量多的队伍排在前面,如果题数相等,保持输入时的相对顺序不要改变。Input 1...原创 2018-03-21 15:36:41 · 312 阅读 · 0 评论 -
27. 移除元素
题目描述:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-element解题思路: 设置左右双指针,左指针 left 表示的是将要被赋值的位置,右指针 right 表示的是原创 2021-04-19 20:27:04 · 220 阅读 · 0 评论 -
5. 快速排序
快速排序的名字简单粗暴,一听到这个名字你就知道它存在的意义,就是快,而且效率高。它是处理大量数据最快的排序算法之一。虽然最坏的情况下的时间复杂度达到了O(n²),比如说顺序数列的快排。但它的平摊期望时间是O(n log n) ,且O(n log n)记号中隐含的常数因子很小,比复杂度稳定等于O(n log n)的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。算法思想: 快速排序是“分而治之”思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基原创 2021-03-23 11:10:43 · 60 阅读 · 0 评论 -
4. 希尔排序
希尔排序是插入排序的一种优化方案。 希尔排序是把序列按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量的逐渐减少,每组包含的数据越来越多,当增量减至1时,整个序列恰好被分为一组,算法便终止。 希尔排序需要定义一个增量,一般会选择增量为数组长度的一半,缩小增量时缩小为当前增量的一半,这是希尔建议的增量,称为希尔增量,但要知道的是,其实这个增量序列不是最优的。...原创 2021-03-23 01:27:12 · 156 阅读 · 0 评论 -
3. 插入排序
算法思想: 插入排序的算法思想应该是最容易理解的,打过扑克或者麻将的人一看就懂。就是将数按照大小插入到对应的位置。算法特点:每趟排序不进行数据交换,只是进行数据的移动;稳定排序。/** * 插入排序:会打扑克牌的都能懂 */public class InsertSort { public static void insertSort(int[] arr) { int len = arr.length; for (int i = 1; i < len; i++) {原创 2021-03-22 20:27:22 · 93 阅读 · 0 评论 -
1. 选择排序
算法思想: 每趟排序都从待排序数中选择一个最小的(或者最大的)数,交换到对应的位置。算法描述:从 i = 0 开始,通过遍历找到下标在 [i, n-1] 中的最小值的下标 index;交换下标为 i 和下标为 index 位置的数据;i ++,继续执行第一步,直到 i >= n-1选择排序是最稳定的排序算法之一,因为无论什么数据进去都是O(n²)的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间。import java.util.Scanne原创 2021-03-22 17:27:48 · 52 阅读 · 0 评论 -
2. 冒泡排序及优化
每一趟排序都将无序区中的最大值放到最后。通过从左向右依次进行相邻数据的大小比较,来将最大值一点一点的移动到最后。基础的冒泡排序public class BubbleSort { /** * 交换数组arr下标为i和j处的值 */ public static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } /** * 基础的冒泡排序原创 2021-03-22 10:19:56 · 176 阅读 · 0 评论 -
141. 环形链表 I
题目描述: 给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/l原创 2021-03-21 20:37:18 · 72 阅读 · 0 评论 -
876. 链表的中间结点
题目描述: 给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/解题思路:双指针 一个指针每次移动一次,另一个指针每次移动两次,当第二个指针移动到链表尾部时,第一个指针正好在中间位置。/** * Definition for singly-linked list. * public c原创 2021-03-21 19:42:05 · 61 阅读 · 2 评论 -
26. 删除有序数组中的重复项
题目描述: 给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array说明: 为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改原创 2021-03-21 15:37:25 · 128 阅读 · 3 评论 -
剑指 Offer 22. 链表中倒数第K个节点
题目描述: 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。 例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof题解一:双指针 解题思路:双指针。原创 2021-03-21 01:57:12 · 128 阅读 · 0 评论 -
链表小结
链表基本操作单链表存储结构struct LNode{ LNode* next; int data;//可以是任何类型的数据};struct LinkList{private: LNode* head; //int length;可以存储表长,但是在这里为了淡化链表中位置概念,所以这里不进行表长的操作public: LinkList...原创 2018-04-11 15:50:39 · 1110 阅读 · 0 评论 -
算术表达式求值(栈的应用)
算术表达式求值的难点运算符有优先规则对于一般的算术表达式a*b+(c-d/e)*f来说,如果要对它求值,在计算机取到×的时候,不能直接运算,需要继续往后取值,找是否有比×运算级高的符号,没有的话才能运算。运算符的操作数是否能直接操作而且还不能保证它的两个操作数都是可以直接操作的,比如针对上式的+来说,它的两个操作数a*b和(c-d/e)*f是不能直接操作的,需要进一步计算a...原创 2018-04-11 22:21:11 · 13485 阅读 · 0 评论 -
数据结构:队列
链队列的实现链式存储结构struct QNode{ int data; int* next;}struct LinkQueue;{ QNode* front; QNode* rear;};操作函数构造void InitQueue (LinkQueue &Q){ Q.front = Q.rear = ...原创 2018-04-20 11:49:36 · 270 阅读 · 0 评论 -
二叉树的遍历
在二叉树的一些应用中,常常要求在树中查找某种特征的结点,or对树中全部结点逐一进行操作。这就提出了遍历二叉树的问题,即如何按某条搜索路径巡访树中每个结点,使得每个结点都被访问一次,而且仅访问一次。 遍历对于二叉树来说,并不容易,因为二叉树是一种非线性结构,每个结点都可能有两颗子树,因而需要寻找一种顺序使每个结点排列在一个线性队列上,从而遍历,即化非线性为线性。 对于二叉树来说,二叉...原创 2018-05-20 19:03:08 · 226 阅读 · 0 评论 -
稀疏矩阵相乘
bool MultSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix &Q){ if (M.data[0].j != N.data[0].i)//data[0]存储了矩阵的行数、列数、非零元个数,这里是M的列数不等于N的行数,根据矩阵相乘的规则,不能相乘 return false; Q.data[0].i = M.da...原创 2018-06-11 22:04:51 · 1081 阅读 · 0 评论 -
三元组稀疏矩阵快速转置
稀疏矩阵是只存储非零元的行值、列值、元素值 data[0]来存储矩阵的行数、列数、非零元个数struct Position{ int row; int col; int value;};struct List{ Position data[MAX + 1];};void Quick_Transpose (List l, List &amp;s)...原创 2018-05-29 11:52:02 · 9085 阅读 · 0 评论 -
栈与队列:进制转换
题目一:Problem Description 输入一个十进制非负整数,将其转换成对应的 R (2 <= R <= 9) 进制数,并输出。 Input 第一行输入需要转换的十进制非负整数; 第二行输入 R。 Output 输出转换所得的 R 进制数。 Sample Input 1279 8 Sample Output 2377 Hint#includ...原创 2018-04-10 21:47:14 · 2510 阅读 · 0 评论