算法集锦
算法
NTZ5bzZKdUw
这个作者很懒,什么都没留下…
展开
-
【栈】----栈的压入、弹出序列
1.题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)2.代码class Solution {public: bool IsPopOrder(vector<int> pushV,vector<int> popV)原创 2020-10-10 00:34:48 · 389 阅读 · 0 评论 -
【动态规划】----矩阵覆盖
1.题目我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:2.代码class Solution {public: int rectCover(int number) { //f(n) = 2*f(n-1)+1;//1-1 2-2 3-3 4-5 5-9 int *dp = new int[number+1]; dp[0] =原创 2020-09-10 23:45:18 · 393 阅读 · 0 评论 -
【动态规划】----跳台阶
1.题目一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。2.代码class Solution {public: int jumpFloor(int number) { //状态递推 //F(N) = F(N-1)+F(N-2) int *dp = new int[number+1]; //初始值 dp[0] = dp[1] = 1;原创 2020-09-10 17:11:28 · 213 阅读 · 0 评论 -
【数】----树的子结构
1.题目输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)2.代码/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: bool _HasSubtree(TreeNode*原创 2020-09-05 16:31:02 · 112 阅读 · 0 评论 -
【链表】----单链表冒泡排序
1.题目请实现list_sort,使用冒泡法将head指向的链表按val值大小排成升序struct node {int val;struct node *next;};void list_sort(struct node *head){}输入描述:第一行为数据个数 第二行为输入的数据,以空格进行分隔输出描述:输出head指向的链表数据,以空格分隔示例1输入1210 22 2 5 9 8 1 33 4 6 7 9输出1 2 4 5 6 7 8 9 9 10 22 332.原创 2020-08-20 18:22:12 · 277 阅读 · 0 评论 -
【链表】----反转链表
1.题目输入一个链表,反转链表后,输出新链表的表头。2.代码/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* ReverseList(ListNode* pHead) { ListNode* prev = nullptr; ListN原创 2020-08-20 00:30:03 · 82 阅读 · 0 评论 -
【数组&二分查找】----旋转数组的最小数字
1.题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。2.代码class Solution {public: int minNumberInRotateArray(vector<int> rotateArray) {原创 2020-08-14 00:13:03 · 128 阅读 · 0 评论 -
【数组】----构建乘积数组
1.题目给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。2.代码暴力求解class Solution {public: vector<in原创 2020-08-12 00:45:12 · 112 阅读 · 0 评论 -
【二叉树】----二叉树的深度
1.题目输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。2.代码分治法class Solution {public: int TreeDepth(TreeNode* pRoot) { if (pRoot == NULL) return 0; int left =1+ TreeDepth(pRoot->left); int righ原创 2020-08-12 00:07:04 · 142 阅读 · 0 评论 -
变态跳台阶
1.题目一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。2.代码递归class Solution {public: int jumpFloorII(int number) { if (number==1 ||number==0) return 1; vector<int> v(number+1,0); v[0]=v[1]=1; for (in原创 2020-08-10 01:13:10 · 100 阅读 · 0 评论 -
【栈】两个栈来实现一个队列
1.代码展示class Solution{public: void push(int node) { /*int tmp=0; while (!stack2.empty()) { tmp = stack2.top(); stack2.pop(); stack1.push(tmp); }*/ stack1.push(node); }原创 2020-08-09 00:00:29 · 85 阅读 · 0 评论 -
杨氏矩阵
1.题目描述有一个二维数组.数组的每行从左到右是递增的,每列从上到下是递增的.在这样的数组中查找一个数字是否存在。时间复杂度小于O(N);2.代码展示#include<iostream>#include<vector>using namespace std;bool Isin(vector<vector<int>> v,int n,int m,int num){ int x = n-1, y = 0; while (x >= 0原创 2020-07-04 00:06:14 · 88 阅读 · 0 评论 -
不用加减乘除做加法
1.题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。2.代码展示class Solution {public: int Add(int num1, int num2) { /*int carry=num1&num2; int sum=num1^num2; while (carry) { int newsum=sum^(carry<<1);原创 2020-07-03 22:46:26 · 104 阅读 · 0 评论 -
一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3
1.题目描述一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3输入描述:输入为两行。 第一行一个整数n(1 <= n <= 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。输出描述:所有连续子数组中和最大的值。示例1输入3 -1 2 1输出32.代码展示#include<iostream>#include<vector>u原创 2020-06-30 16:10:49 · 1542 阅读 · 0 评论 -
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。
1.题目描述“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。例如:A = “aba”,B = “b”。这里有4种把B插入A的办法:在A的第一个字母之前: “baba” 不是回原创 2020-06-30 15:37:16 · 5183 阅读 · 0 评论 -
给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数
1.题目描述给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数输入描述:输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。输出描述:为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10用A表示,等等)示例1输入7 2输出1112.代码展示#include<iostream>#include<string>#include<vector>using nam原创 2020-06-30 15:27:34 · 1144 阅读 · 0 评论 -
A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息:
1.题目描述A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息:A - B, B - C, A + B, B + C. 这四个数值.每个字母代表每个人所拥有的糖果数.现在需要通过这四个数值计算出每个人手里有多少个糖果,即A,B,C。这里保证最多只有一组整数A,B,C满足所有题设条件。输入描述:输入为一行,一共4个整数,分别为A - B,B - C,A + B,B + C,用空格隔开。 范围均在-30到30之间(闭区间)。输出描述:原创 2020-06-29 23:10:06 · 385 阅读 · 0 评论 -
读入一个字符串str,输出字符串str中的连续最长的数字串
1.题目描述读入一个字符串str,输出字符串str中的连续最长的数字串输入描述:个测试输入包含1个测试用例,一个字符串str,长度不超过255。输出描述:在一行内输出str中里连续最长的数字串。示例1输入abcd12345ed125ss123456789输出1234567892.代码展示#include<iostream>#include<string>using namespace std;int main (){ string s;原创 2020-06-29 22:42:25 · 753 阅读 · 0 评论 -
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
1.题目描述将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I输入描述:每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100输出描述:依次输出倒置之后的字符串,以空格分割输入I like beijing.输出beijing. like I2.代码展示#include<iostream>#include<string>#include<algorit原创 2020-06-29 16:32:27 · 1978 阅读 · 2 评论 -
洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程。 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张。
1.题目描述题目描述洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程。 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张。首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上半堆),右手拿着第n+1张到第2n张(下半堆)。接着就开始洗牌的过程,先放下右手的最后一张牌,再放下左手的最后一张牌,接着放下右手的倒数第二张牌,再放下左手的倒数第二张牌,直到最后放下左手的第一张牌。接着把牌合并起来就可以了。 例如有6张牌,最开始牌的序列是1,2,3,4,5,6。首先分成两组,原创 2020-06-26 22:22:02 · 652 阅读 · 0 评论 -
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
1.题目给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 = “2”, num2 = “3”输出: “6”示例 2:输入: num1 = “123”, num2 = “456”输出: “56088”说明:num1 和 num2 的长度小于110。num1 和 num2 只包含数字 0-9。num1 和 num2 均不以零开头,除非是数字 0 本身。不能使用任何标准库的大数类型(比原创 2020-06-10 18:55:43 · 5959 阅读 · 1 评论 -
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在
1.题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出02.代码展示方法一:class Solution {public: int MoreThanHalfNum_Solution(vector<int> numbers) { if (numbers.empty()){ return 0;原创 2020-06-04 21:29:46 · 552 阅读 · 0 评论 -
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
1.题目给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。2.代码展示class Solution {public: vector<vector<int>> generate(int numRows) { vector<vector<int>> vv(numRows); for (int i=0; i<numRows; ++i) { vv[i]原创 2020-06-04 19:42:17 · 2108 阅读 · 0 评论 -
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。 例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
1.题目输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”输入描述 :每个测试输入包含2个字符串输出描述 :输出删除后的字符串示例1输入复制They are students.aeiou输出复制Thy r stdnts.2 .代码展示#define _CRT_SECURE_NO_WARNINGS 1#include<iostream&原创 2020-06-03 23:23:47 · 1318 阅读 · 0 评论 -
牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。
1.题目牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。例如:一个队伍三个队员的水平值分别是3,3,3.那么队伍的水平值是3一个队伍三个队员的水平值分别是3,2,3.那么队伍的水平值是3一个队伍三个队员的水平值分别是1,5,2.那么队伍的水平值是2为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。如样例所示:如果牛牛把6个队员划分到两个队伍原创 2020-06-03 15:02:05 · 766 阅读 · 2 评论 -
给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。
1.题目给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。示例 1:输入:“ab-cd”输出:“dc-ba”示例 2:输入:“a-bC-dEf-ghIj”输出:“j-Ih-gfE-dCba”示例 3:输入:“Test1ng-Leet=code-Q!”输出:“Qedo1ct-eeLg=ntse-T!”提示:S.length <= 10033 <= S[i].ASCIIcode <= 122S 中不包含 \ o原创 2020-06-01 17:54:24 · 678 阅读 · 0 评论 -
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
1.题目给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。示例:输入: s = “abcdefg”, k = 2输出: “bacdfeg”提示:该字符串只包含小写英文字母。给定字符串的长度和 k 在 [1, 10000] 范围内。2.代码展示class Solution {public:原创 2020-06-01 16:59:55 · 2264 阅读 · 0 评论 -
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
1.题目给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。注意:num1 和num2 的长度都小于 5100.num1 和num2 都只包含数字 0-9.num1 和num2 都不包含任何前导零。你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。2.代码展示class Solution {public: string addStrings(string num1, string num2) { int carr原创 2020-06-01 16:13:28 · 2639 阅读 · 1 评论 -
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
1.题目给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。示例 1:输入: “Let’s take LeetCode contest”输出: “s’teL ekat edoCteeL tsetnoc”注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格2 .代码展示class Solution {public: string reverseWords(string s) { auto begin = s.beg原创 2020-05-29 23:32:52 · 2946 阅读 · 0 评论 -
字符串的最后一个单词的长度
1.题目题目描述计算字符串最后一个单词的长度,单词以空格隔开。输入描述:一行字符串,非空,长度小于5000。输出描述:整数N,最后一个单词的长度。示例1输入hello world输出52.代码展示#include<iostream>#include<string>using namespace std;int main(){ string s; while (getline(cin,s)){ size_t pos = s原创 2020-05-29 23:21:56 · 117 阅读 · 0 评论 -
连续子数组的最大和(牛客)
1.题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)2.代码展示class Solution {p原创 2020-05-23 00:17:52 · 204 阅读 · 0 评论 -
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素
1.题目给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。示例 :输入: [1,2,1,3,2,5]输出: [3,5]注意:结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?2.代码展示class Solution {public: vector<int> singleNumber(vector<int>&am原创 2020-05-20 00:07:35 · 3942 阅读 · 1 评论 -
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
1.题目给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,3,2]输出: 3示例 2:输入: [0,1,0,1,0,1,99]输出: 992.代码展示class Solution {public: int singleNumber(vector<int>& nums) { int arr[3原创 2020-05-18 23:41:48 · 1713 阅读 · 0 评论 -
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成
1.题目给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums = [0,0,1,1,1,2,2,3,3,4],函数应该返回新的长度 5, 并且原数组 n原创 2020-05-16 23:13:16 · 771 阅读 · 0 评论 -
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
1.题目给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 42.代码展示class Solution {public: int singleNumber(vector<int>& nums) { int sum = 0;原创 2020-05-14 23:08:44 · 611 阅读 · 2 评论 -
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
1.题目给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。案例:s = “leetcode”返回 0.s = “loveleetcode”,返回 2.2.代码展示int firstUniqChar(char * s){ int arr[26]={0}; int len = strlen(s); int n=0; f...原创 2020-05-05 00:16:17 · 5440 阅读 · 2 评论 -
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
1.题目给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度后面的元素。示例 2...原创 2020-05-03 19:23:22 · 3335 阅读 · 0 评论 -
设计一个程序能计算一个日期加上若干天后是什么日期。
1.题目描述设计一个程序能计算一个日期加上若干天后是什么日期。输入描述:输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。输出描述:输出m行,每行按yyyy-mm-dd的个数输出。示例1输入12008 2 3 100输出2008-05-132.代码展示#include<iostream>using namespace std;cl...原创 2020-05-02 17:56:53 · 1039 阅读 · 0 评论 -
给出年分m和一年中的第n天,算出第n天是几月几号。
1.题目描述给出年分m和一年中的第n天,算出第n天是几月几号。输入描述:输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。输出描述:可能有多组测试数据,对于每组数据,按 yyyy-mm-dd的格式将输入中对应的日期打印出来。示例1输入2000 32000 312000 402000 602000 612001 60输出20...原创 2020-05-02 00:57:15 · 1561 阅读 · 0 评论 -
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
1.题目题目描述有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天输入描述:有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD输出描述:每组数据输出一行,即日期差值示例1输入2011041220110422输出112.代码展示#include<iostream>using namespace std;cl...原创 2020-05-02 00:17:32 · 1201 阅读 · 0 评论