![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
习题
习题
头晕神教的神秘人
这个作者很懒,什么都没留下…
展开
-
组队竞赛、删除公共字符
题目一:组队竞赛解析:最主要的目标:要让每组的中间值最大,才能保证最后的总和最大步骤:将获取到的数组进行排序从后面取2个最大的数,从前面取1个最小的数组成一组循环第二步直到分组完毕将中间值进行累加求和这里还有一个问题 就是目标中的8、6、4这三个数组的位置如何求得?采用循环:for(int i=0;i<n;i++){ idx=arr.size()-2*(i+1)}例如:通过上述公式计算后,8在数组中的的位置是9-2*(0+1)=7;6的位置是9-2*(1+1)=5原创 2021-06-05 13:03:41 · 133 阅读 · 0 评论 -
最难的问题、质因子个数
题目一:思路:原文中的字母对应到密码中,要向后走五个字母,即A对F,B对G,C对H…那么密码对应到原文中就是向前走五个,观察可知密码中从E向后的任一字母向前走五位不需要翻转,而ABCDE翻译成原文时需要翻转到字母表的尾部,所以:当密码中的字母ch<=‘E’时,ch+=21可找到原文当密码中的字母ch>='E’时,ch-=5可以找到原文#include<stdio.h>int main(){ char ch; while ((ch=getchar()) !=原创 2021-05-31 21:31:05 · 257 阅读 · 0 评论 -
[leetcode] 692.前K个高频单词
题目链接:leetcode 692思路先将每个单词及出现频数存放在map<string,int>中将map中的键值对交换顺序(将<string,int>变成<int,string>),并且按照出现频率从大到小的顺序存放在multimap<int,string>中遍历multimip,将前k个频率最高的单词插入到vector<string> 中返回目标vector对象class Solution {public: vect原创 2021-05-30 20:46:24 · 130 阅读 · 0 评论 -
哈希结构基础编程题
文章目录1.存在重复元素2.两句话中的不常见单词3.两个数组的交集1.存在重复元素leetcode链接思路:将数组中元素及出现次数存放在unordered_map中,遍历unordered_map,如果有出现次数大于1的,返回true;否则返回false。class Solution {public: bool containsDuplicate(vector<int>& nums) { unordered_map<int,int> m;原创 2021-05-27 11:46:19 · 131 阅读 · 0 评论 -
[剑指offer]JZ10 矩形覆盖
题目链接:矩形覆盖算法:动态规划时间复杂度:O(n)空间复杂度:O(1)逐步分析:总结规律:每一次的结果等于前两次的和f[n]=f[n-1]+f[n-2];初始值:f[1]=1,f[2]=2;class Solution {public: int rectCover(int number) { if(number==0||number==1||number==2) return number; int a=1,b=2,c;原创 2021-05-23 22:08:19 · 110 阅读 · 0 评论 -
[剑指offer]JZ1 二维数组中的查找
题目链接:二位数组中的查找第一种解法:暴力搜索没什么好讲的,遍历就完事了,注意判空!时间复杂度:O(n^2)空间复杂度:O(1)//暴力算法:时间:O(n^2) 空间:O(1)class Solution {public: bool Find(int target, vector<vector<int> > array) { if(array.size()==0||array[0].size()==0) return原创 2021-05-23 21:18:07 · 101 阅读 · 0 评论 -
使用递归方法反转链表
题目链接:leetcode-反转链表思路:单链表的反转可以看作是每两个相邻结点之间链接关系的反转,所以我们可以将整个链表的反转分解成两个相邻结点之间的链接关系的反转。图示:代码:class Solution {public: ListNode* reverseList(ListNode* head) { if(head==nullptr||head->next==nullptr) return head; ListNod原创 2021-05-16 15:18:33 · 157 阅读 · 0 评论 -
[手套]在地下室里放着n种颜色的手套,手套分左右手,但是每种颜色的左右手手套个数不一定相同。
题目链接:手套思路:遇到这类题目不要慌,题目会给你一个固定的场景来求解,好像一个实际应用题,透过现象看本质,忽略它设定的场景,只关心我们需要的数据和他所要求的结果。举例说明:假设现在有红蓝绿黑四种颜色的数据若干个,现在问在不辨别颜色的前提下,至少要取多少次能凑出来一对颜色相同的数字。我们可以将一边的所有颜色数字都取到,然后再从另外一边任意取一个数字就能有一对相同颜色的数字,题目问的是至少多少次,所以这里我们不仅要满足要求,还要保证性能。如何保证每个颜色都取到:找出颜色最少的数字取一个,其余数.原创 2021-05-15 15:47:04 · 452 阅读 · 2 评论 -
查找输入整数二进制中1的个数
题目描述:解法一:将输入的整数和1进行按位与操作,结果为1,就表示当前整数最低位为1,将整数右移一位后重复前一步骤#include<iostream>using namespace std;int main(){ int n=0; while(cin>>n) { int count=0,i=0; while(n) { if(1==(n&1))原创 2021-05-15 10:33:20 · 132 阅读 · 0 评论 -
[leetcode]236. 二叉树的最近公共祖先
题目链接:leetcode 236. 二叉树的最近公共祖先题目描述:思路解析:1、查找:递归遍历,查找两个目标结点的路径,并且将路径存放进栈内2、栈的裁剪:将两个栈按照小的栈进行裁剪,变成等长3、查找公共祖先图示:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNod原创 2021-05-11 15:13:39 · 103 阅读 · 0 评论 -
[剑指offer]jz. 28 数组中出现次数超过一半的数字 哈希结构+摩尔投票算法
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解法一:1、定义一个数组num[ ]存放数组中的数字出现的次数2、遍历数组,每遇到一个数字,假设为i,就将num[ ]中的第i项的值+13、判断并返回num[ ]中出现次数大于数组长度一半的数字(注意:此处应该返回的是项数i的值)时间复杂度为O(n)//数组中出现次数超过一半的数原创 2021-04-21 15:50:17 · 142 阅读 · 1 评论 -
【C++基础知识】queue的模拟实现
queue:队列具有先进先出的特点,其pop操作时会删除队首元素,也就是当前序列的第一个元素所以此处我们不能使用vector来实现queue,一位内vector没有头删的接口实际操作十分简单,调用deque或者list的底层接口即可,直接看代码:#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<vector>#include<queue>#include<list>#in原创 2021-04-19 18:44:04 · 209 阅读 · 0 评论 -
【C++基础知识】模拟实现优先队列
优先队列的概念—priority_queue普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列(priority_queue)中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出的行为特征。优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其原创 2021-04-19 10:39:13 · 320 阅读 · 0 评论 -
【C++基础知识】stack的模拟实现
方法一:用vector模拟实现stack#include<iostream>#include<list>#include<vector>using namespace std;template <class T>class Stack {public: void push(const T&val) { st_.push_back(val); } void pop() { st_.pop_back(); } T&原创 2021-04-12 18:56:16 · 357 阅读 · 0 评论 -
[leetcode]150. 逆波兰表达式求值
思路:按照tokens数组的顺序将操作数按照整数形式全部压入栈中,若遇到运算符,则去栈顶的两个元素进行运算,将结果再压入栈中,循环执行,直到tokens中的数据全部读完,此时栈中仅剩一个数据,就是正确的运算结果。图示:代码:class Solution {public: int evalRPN(vector<string>& tokens) { stack<int>st; for(const auto&s.原创 2021-04-12 13:49:01 · 204 阅读 · 0 评论 -
【剑指offer】栈的压入、弹出序列
牛客网链接:栈的压入、弹出序列.解析:题目要求,给定入栈序列和出栈序列,判断该出栈序列是否合法,即按照给定的顺序入栈,能否得到给定的出栈序列思路:按照给定的入栈序列和出栈序列,模拟栈的压入和弹出操作,如果操作完毕后栈为空,则正确,否则错误具体操作:1、每次入栈一个元素,判断栈顶元素和出栈序列的待出栈元素是否相同:相同,出栈,继续比较;不同,将入栈序列中的下一个元素入栈2、判断栈空为空:正确,返回true非空:错误,返回falseclass Solution {publi.原创 2021-04-12 11:54:19 · 225 阅读 · 0 评论 -
[算法]动态规划
文章目录概述例题1:求斐波那契数列第n项的值常规做法:**递归**动态规划做法:例题2:青蛙跳台阶问题概述 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。原创 2021-04-10 14:13:35 · 552 阅读 · 0 评论 -
面试中string类的一种正确写法
C++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源。具体来说:1、能像 int 类型那样定义变量,并且支持赋值、复制。2、能用作函数的参数类型及返回类型。3、能用作标准库容器的元素类型,即 vector/list/deque 的 value_type。(用作 std::map 的 key_type 是更进一步的要求,本文从略)。换言之,你的 String 能让以下代码编译运行通过,并且没有内存方面的错误。vo转载 2021-04-03 17:27:58 · 229 阅读 · 0 评论 -
[数据结构] 构建二叉树并实现相关功能
完整代码:#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<string.h>typedef char datatype;//二叉树的结点 二叉链typedef struct BinaryTreeNode{ struct Node* left; struct Node* right; datatype data;}Node;ty原创 2021-01-10 12:18:54 · 318 阅读 · 0 评论 -
leetcode算法题-用栈实现队列
题目要求出队操作假设有四个有效元素1,2,3,4依次存入,出栈顺序:4,3,2,1.出队顺序:1,2,3,4.此时出栈操作只能出栈的最后一个元素4,而出队操作出的是队列的第一个元素1,此时我们可以再定义一个副栈,将前3个元素出栈再入栈到副栈中,再对主栈进行出栈操作,就实现了1的出栈,封装后可视为出队操作,图解:leetcode题目链接:用栈实现队列完整代码:#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include原创 2020-12-30 16:30:56 · 285 阅读 · 0 评论 -
leetcode算法题-用队列实现栈
题目要求:用队列实现出栈出队的原则:先进先出。 出栈的原则:后进先出。例如:有四个元素1,2,3,4依次入队,其出队顺序为:1,2,3,4。若1,2,3,4依次入栈,其出栈顺序为4,3,2,1。也就是说出栈操作去除的是当前队列的最后一个元素4,那我们只需要将前3个元素出队再入队,此时4为队首元素,再将其进行出队即可。下面看图解:剩余的获取栈顶元素,销毁栈等操作比较简单在此不多赘述,附上用队列实现栈–leetcode链接以及完整代码:#define _CRT_SECURE_NO_WA原创 2020-12-30 16:08:07 · 343 阅读 · 0 评论 -
【算法题】反转链表的两种方法
反转单链表的两种办法方法一:首先,创建一个与五个元素的单链表,定义三个指针,cur和next分别指向头结点和它的下一个结点,newhead指针来存储新的头结点(newhead初始值为NULL)。如图:第二步,将cur->next指向newhead,再将cur的值赋给newhead,然后cur和next向后移动,此时cur指向数字2,next指向3,如下图:(这一步操作断开了1和2之间的联系,1成为了新的头结点,重复执行此步骤,类似于单链表的头插)后面的循环步骤用图片演示:最后一原创 2020-12-16 10:48:50 · 438 阅读 · 0 评论 -
C语言小项目---通讯录系统
项目要求:实现一个通讯录;通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址提供方法:添加联系人信息删除指定联系人信息查找指定联系人信息修改指定联系人信息显示所有联系人信息清空所有联系人以名字排序所有联系人这个系统我们分为三个部分来实现:contact.h·这个一部分主要是我们是所用到的函数和联系人信息这一结构体的声明以及各种头文件的引用。contact.c该部分是实现增,删,改,查,排序,清空,显示等功能的函数定义test.c该部分是主函原创 2020-11-03 17:26:20 · 731 阅读 · 0 评论 -
C语言编程—将一个数组逆序##
首先定义两个数组指针(左指针和右指针)分别指向该数组的第一个值和最后一个值,然后将左右指针所指向的值进行交换,然后左指针+1,右指针-1,继续循环,直到左右指针相遇或左指针大于右指针即停止。代码如下:#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<string.h>void Reverse(char* str){ char* left = str; char* right = str + strlen原创 2020-10-29 21:31:56 · 1007 阅读 · 0 评论 -
字符串左旋的三种解决方法
题目:要求左旋一个字符串,例如将ABCDEF左旋两次后得到CDEFAB解法一:第一种方法非常简单,假设要在这里插入代码片求左旋k次,我们将字符串首元素挪到最后一个字符处,然后将其余字符向前平移,循环k次即可解决,下面看具体代码#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<string.h> void left_move(char arr[], int k){ int i = 0; int原创 2020-10-25 14:06:56 · 1297 阅读 · 6 评论 -
C语言例题--数据的存储
int main(){ char a[1000] = {0}; int i=0; for(i=0; i<1000; i++) { a[i] = -1-i; } printf("%d",strlen(a)); return 0;}思考这段代码的输出结果解析:a是字符型数组,strlen找的是第一次出现尾零(即值为0)的位置。考虑到a[i]其实是字符型(占一个字节),如果要为0,则需要-1-i的低八位要是全0(即一个字节为0),也就是问题简化成了“寻找当-1原创 2020-10-03 18:29:18 · 376 阅读 · 0 评论 -
C语言例题--数组的越界访问
废话不多说直接看代码#include <stdio.h>int main(){ int i = 0; int arr[] = {1,2,3,4,5,6,7,8,9,10}; for(i=0; i<=12; i++) { arr[i] = 0; printf("hello\n"); } return 0;}思考一下!!!这道题的运行结果是死循环打印hello原理图如下:...原创 2020-10-03 16:19:38 · 450 阅读 · 0 评论 -
求程序的输出结果-循环语句的应用
#include <stdio.h>int main(){ int a = 0, b = 0; for (a = 1, b = 1; a <= 100; a++) { if (b >= 20) break; if (b % 3 == 1) { b = b + 3; continue; } b = b-5; } printf("%d\n", a); return 0;}题目如上,求程序的输出结果。解析:第一次循环:a = 1,b原创 2020-09-20 10:13:08 · 470 阅读 · 0 评论 -
【练习题】日期累加
文章目录类的定义getday()重载运算符+=友元函数重载<<完整代码类的定义class Date {public:Date(int y = 1, int m = 1, int d = 1) { //判断日期是否有效 if (y <= 0 || m <= 0 || m > 12 || d <= 0 || d > getday(y, m)) { //日期无效 y = 1; m = 1; d = 1; cout <原创 2021-03-18 20:18:56 · 260 阅读 · 0 评论