![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
小虾米qq
我是小虾米
展开
-
图书管理系统
#include<iostream>#include<fstream>#include<stdio.h>#include<conio.h>#include<string>#include<vector>#include<iomanip>#include<algorithm>using namespace std;struct book{ int idnum;//图书检索号原创 2017-01-12 16:05:42 · 420 阅读 · 1 评论 -
空格替换
请编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成。 给定一个string iniString 为原始的串,以及串的长度 int len, 返回替换后的string。 测试样例: “Mr John Smith”,13 返回:”Mr%20John%20Smith” ”原创 2017-02-24 10:46:56 · 157 阅读 · 0 评论 -
可查询最值的练习题
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。class Solution {public: stack<int> istack; stack<int> minstack; void push(int value) { istack.push(value); if(minstack.empty()||va原创 2017-02-24 11:32:50 · 170 阅读 · 0 评论 -
字符串子串
对于一个字符串变量,例如"adereegfbw",它的子串就是像"ader"这样可以从中找到的连续的字符串。字符串"adereegfbw"本身也属于它本身最长的子串。ab的子串:a、b、ab和一个空子串共4个即(2+1+1)个,abc的子串:a、 b、 c、 ab、 bc 、abc和一个空子串 共(3+2+1+1)个所以若字符串的长度为n,则子串的个数就是[n*(n+1)/2]个,转载 2017-02-15 22:20:52 · 704 阅读 · 0 评论 -
双栈队列练习题
链接:https://www.nowcoder.com/courses/1/4/4 来源:牛客网编写一个类,只能用两个栈结构实现队列,支持队列的基本操作(push,pop)。 给定一个操作序列ope及它的长度n,其中元素为正数代表push操作,为0代表pop操作,保证操作序列合法且一定含pop操作,请返回pop的结果序列。 测试样例: [1,2,3,0,4,0],6 返回:[1,2]`cl原创 2017-02-24 19:53:09 · 200 阅读 · 0 评论 -
栈的反转
链接:https://www.nowcoder.com/courses/1/4/5 来源:牛客网实现一个栈的逆序,但是只能用递归函数和这个栈本身的pop操作来实现,而不能自己申请另外的数据结构。 给定一个整数数组A即为给定的栈,同时给定它的大小n,请返回逆序后的栈。 测试样例: [4,3,2,1],4 返回:[1,2,3,4]class StackReverse {public:原创 2017-02-24 20:30:43 · 207 阅读 · 0 评论 -
双栈排序问题
请编写一个程序,按升序对栈进行排序(即最大元素位于栈顶),要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中。 给定一个int[] numbers(C++中为vector),其中第一个元素为栈顶,请返回排序后的栈。请注意这是一个栈,意味着排序过程中你只能访问到第一个元素。 测试样例: [1,2,3,4,5] 返回:[5,4,3,2,1]class TwoStacks原创 2017-02-24 21:13:22 · 294 阅读 · 0 评论 -
二叉树的前序中序后序遍历递归
请用递归方式实现二叉树的先序、中序和后序的遍历打印。 给定一个二叉树的根结点root,请依次返回二叉树的先序,中序和后续遍历(二维数组的形式)。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x原创 2017-02-25 21:06:48 · 197 阅读 · 0 评论 -
二叉树的前序中序后序遍历非递归
前序: 1、首先申请一个新的栈,为stack 2、将头节点head压入stack; 3、每次从栈中弹出栈顶节点,记为cur,然后打印cur节点的值,如果cur的右孩子不为空的话,将右孩子压入栈中,如果cur的左孩子不为空的话,讲cur得左孩子压入栈中。 4、不断重复3,知道stack为空,全部过程结束 中序: 1、首先申请一个栈a申请一个变量cur,cur为头结点 2、把节点压入栈中,原创 2017-02-25 22:21:26 · 173 阅读 · 0 评论 -
记录某个数字出现的次数
链接:https://www.nowcoder.com/questionTerminal/fbcf95ed620f42a88be24eb2cd57ec54 来源:牛客网春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。 给定一个红包的金额数组g原创 2017-03-05 12:13:48 · 387 阅读 · 0 评论 -
层序遍历二叉树与二叉树序列化
链接:https://www.nowcoder.com/courses/1/7/5 来源:牛客网有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。 给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列。保证结点数小于等于500。“` /* struct TreeNode { int va原创 2017-02-27 10:50:45 · 420 阅读 · 0 评论 -
判断是否为平衡二叉树
有一棵二叉树,请设计一个算法判断这棵二叉树是否为平衡二叉树。 给定二叉树的根结点root,请返回一个bool值,代表这棵树是否为平衡二叉树。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x),原创 2017-02-27 11:51:37 · 285 阅读 · 0 评论 -
完全二叉树判断
有一棵二叉树,请设计一个算法判断它是否是完全二叉树。 给定二叉树的根结点root,请返回一个bool值代表它是否为完全二叉树。树的结点个数小于等于500。 1、按照层遍历 2、若有右孩子,没有左孩子,返回false 3、并不是左右孩子都有,后面必须为叶节点; 4、便利过程中如果不返回false,则返回true。/*struct TreeNode { int val; st原创 2017-02-27 14:49:50 · 268 阅读 · 0 评论 -
折纸
链接:https://www.nowcoder.com/courses/1/7/11 来源:牛客网请把纸条竖着放在桌⼦上,然后从纸条的下边向上⽅对折,压出折痕后再展 开。此时有1条折痕,突起的⽅向指向纸条的背⾯,这条折痕叫做“下”折痕 ;突起的⽅向指向纸条正⾯的折痕叫做“上”折痕。如果每次都从下边向上⽅ 对折,对折N次。请从上到下计算出所有折痕的⽅向。 给定折的次数n,请返回从上到下的折痕的数组原创 2017-02-27 15:18:58 · 284 阅读 · 0 评论 -
KMP算法
kmp算法 编辑 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。1.部分匹配值原创 2017-03-15 16:10:16 · 272 阅读 · 0 评论 -
字典最小顺序
对于一个给定的字符串数组,请找到一种拼接顺序,使所有小字符串拼接成的大字符串是所有可能的拼接中字典序最小的。 给定一个字符串数组strs,同时给定它的大小,请返回拼接成的串。 测试样例: [“abc”,”de”],2 “abcde”class Prior {public: static bool cmp(string a,string b) {原创 2017-02-24 10:37:17 · 500 阅读 · 0 评论 -
字符串移位
对于一个字符串,请设计一个算法,将字符串的长度为len的前缀平移到字符串的最后。 给定一个字符串A和它的长度,同时给定len,请返回平移后的字符串。 测试样例: “ABCDE”,5,3 返回:”DEABC”“` class Translation { public: string stringTranslation(string A, int n, int len) {原创 2017-02-24 10:09:49 · 358 阅读 · 0 评论 -
旋转字符串
链接:https://www.nowcoder.com/courses/1/3/5 来源:牛客网如果对于一个字符串A,将A的前面任意一部分挪到后边去形成的字符串称为A的旋转词。比如A=”12345”,A的旋转词有”12345”,”23451”,”34512”,”45123”和”51234”。对于两个字符串A和B,请判断A和B是否互为旋转词。 给定两个字符串A和B及他们的长度lena,lenb,请原创 2017-02-23 11:31:01 · 167 阅读 · 0 评论 -
二叉树的最小深度
注意事项: 1、求解最小深度 单子树的情况下:最小深度为左右深度的最大值 双子树的情况下:最小深度为左右子树的最小深度2、求解最大深度: 左右子树的最大值class Solution{int run(TreeNode *root){if(!root)return 0;int l=run(root->left);int r=run(root->right);if(l==0||r转载 2017-02-16 20:27:11 · 153 阅读 · 0 评论 -
二分搜索局部最小
链接:https://www.nowcoder.com/courses/1/6/2 来源:牛客网定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0]class Solution {public: int getLessIndex(vector<int> arr) { int len=arr.size();原创 2017-02-27 21:55:09 · 271 阅读 · 0 评论 -
二分搜索最左位置
对于一个有序数组arr,再给定一个整数num,请在arr中找到num这个数出现的最左边的位置。 给定一个数组arr及它的大小n,同时给定num。请返回所求位置。若该元素在数组中未出现,请返回-1。 测试样例: [1,2,3,3,4],5,3 返回:2 注意事项 第一种left<=right 第二种leftclass LeftMostAppearance {public: in原创 2017-02-27 22:17:43 · 281 阅读 · 0 评论 -
文章标题
链接:https://www.nowcoder.com/courses/1/5/5来源:牛客网对于一个链表,我们需要用一个特定阈值完成对它的分化,使得小于等于这个值的结点移到前面,大于该值的结点在后面,同时保证两类结点内部的位置关系不变。 给定一个链表的头结点head,同时给定阈值val,请返回一个链表,使小于等于它的结点在前,大于等于它的在后,保证结点值不重复。 测试样例: {1,4,2,5原创 2017-02-28 10:27:14 · 172 阅读 · 0 评论 -
计算字符串最后一个单词的长度
题目描述 计算字符串最后一个单词的长度,单词以空格隔开。输入描述: 一行字符串,非空,长度小于5000。输出描述: 整数N,最后一个单词的长度。输入例子: hello world输出例子: 5注意事项 1、应用两个函数rfind和substr rfind:反向查找, substr:从当前位置向后的字符串 代码段#include<iostream>#include<string>u原创 2017-02-18 21:12:49 · 369 阅读 · 0 评论 -
动态规划找零钱问题
暴力搜索方法 arr{5.10.25.1},aim=1000。 1、用0张5元的货币,让{10.25.1}组成剩下的1000,最终方法记为res1 2、用1张5元的货币,让{10.25.1}组成剩下的995,最终方法记为 res2 ……….201/用200张5元的货币,让{10.25.1}组成剩下的0,最终方法记为 res201; 记忆搜索的方法: 动态规划方法 经典问题: 找零原创 2017-02-28 15:25:43 · 686 阅读 · 0 评论 -
动态规划台阶问题
链接:https://www.nowcoder.com/courses/1/12/4 来源:牛客网有n级台阶,一个人每次上一级或者两级,问有多少种走完n级台阶的方法。为了防止溢出,请将结果Mod 1000000007 给定一个正整数int n,请返回一个数,代表上楼的方式数。保证n小于等于100000。 测试样例: 1 返回:1原创 2017-02-28 16:19:45 · 454 阅读 · 0 评论 -
动态规划路径最小问题
链接:https://www.nowcoder.com/courses/1/12/5 来源:牛客网有一个矩阵map,它每个格子有一个权值。从左上角的格子开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。 给定一个矩阵map及它的行数n和列数m,请返回最小路径和。保证行列数均小于等于100. 测试样例:原创 2017-02-28 16:45:03 · 288 阅读 · 0 评论 -
冒泡排序
时间复杂度O(n^2) 每次前一个与后一个比较,把最大的放到最后,然后把倒数第二大的数据放在倒数第二位。class BubbleSort {public: int* bubbleSort(int* A, int n) { //int n=sizeof(A); for(int i=0;i<n-1;i++) {原创 2017-02-22 11:38:12 · 523 阅读 · 0 评论 -
选择排序
和冒泡排序相比, 选择排序把每两个数相比的结果的最小值放在最前面,时间复杂度O(n^2)class SelectionSort {public: int* selectionSort(int* A, int n) { // write code here for(int i=0;i<n;i++) { for(原创 2017-02-22 11:57:23 · 124 阅读 · 0 评论 -
插入排序
class InsertionSort {public: int* insertionSort(int* A, int n) { // write code here for(int i=1;i<n;i++) { for(int j=i;j>0;j--) {原创 2017-02-22 15:51:14 · 145 阅读 · 0 评论 -
树A与树B的同构问题(可以转换为字符串问题)
对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。 给定两棵二叉树的头结点A和B,请返回一个bool值,代表A中是否存在一棵同构于B的子树。注意事项 1、把书字符串化(前序、中序、后序) 2、第一种方法:直接配对(时间复杂度O(M*N)) 第二种方法:KMP算法,时间复杂度O(M+N) 1、string A,B,C ,if(C.find(原创 2017-02-23 10:49:01 · 443 阅读 · 0 评论 -
字符串变形词
链接:https://www.nowcoder.com/courses/1/3/3 来源:牛客网对于两个字符串A和B,如果A和B中出现的字符种类相同且每种字符出现的次数相同,则A和B互为变形词,请设计一个高效算法,检查两给定串是否互为变形词。 给定两个字符串A和B及他们的长度,请返回一个bool值,代表他们是否互为变形词。 测试样例: “abc”,3,”bca”,3 返回:trueclas原创 2017-02-23 11:25:30 · 455 阅读 · 0 评论 -
树的公共祖先问题
#include<iostream>#include<vector>#include<list>using namespace std;struct TNode{ int key; vector<TNode *> m_vchildren;};int GetNodePath(TNode *pRoot, TNode *pNode, list<TNode *>&path){原创 2017-08-27 17:08:14 · 272 阅读 · 0 评论