刷题
一只努力的喵
这个作者很懒,什么都没留下…
展开
-
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。
题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路:1.定义一个辅助vector容器temp;2.按照压入顺序每次尾插一个元素3.判断temp最后一个元素和弹出顺序中的元素是否相同,若相同,尾删temp中的元素;4.重复比较,直到原创 2020-07-31 18:54:21 · 276 阅读 · 0 评论 -
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解析:因为青蛙每次可以跳1,2,3,,,,n级;所以当青蛙在第n级台阶上时,它可能是从1,2,3,,,,,n-1级台阶上跳上来的,所以f(n)=f(1)+f(2)+…+f(n-1);当n=1时,f(1)=1;当n=2时,f(2)=2;当n=3时,f(3)=f(1)+f(2);…当n=n-1时,f(n-1)=f(1)+f(2)+…+f(n-2);当n=n时,f(n)=f(1)+f(2)+…+f(n-2)+f(n-1)=f(n-1)+f(n-1)=2f(n-1);代码: int jumpFl原创 2020-07-31 17:05:55 · 1271 阅读 · 1 评论 -
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。
题目描述: 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”思路:(1)将字符串s2中的字符逐个存储在unordered_set中,(2)然后在unordered_set中查找s1中的元素,(3)若s1中的元素不在unordered_set中,将该元素插入到新的字符串result中。(4)返回字符串result。代码:#include <iostre原创 2020-07-31 15:24:53 · 2799 阅读 · 0 评论 -
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 ListNode* deleteDuplication(ListNode* pHead) { if(pHead==nullptr) return nullptr; ListNode* head=new Li原创 2020-07-29 16:01:38 · 805 阅读 · 0 评论 -
操作给定的二叉树,将其变换为源二叉树的镜像。
题目描述:原二叉树如图所示:镜像二叉树:观察两颗二叉树,二叉树镜像就是从上至下一次进行左右子树交换。 void Mirror(TreeNode *pRoot) { if(pRoot==nullptr) return; swap(pRoot->left, pRoot->right); Mirror(pRoot->left); Mirror(pRoot->right); }原创 2020-07-29 10:49:16 · 145 阅读 · 0 评论 -
输入两棵二叉树A,B,判断B是不是A的子结构。
思路: 递归(1)先确定其实位置(2)再比较左右子树是否相等 //比较左右子树是否相等 bool IsSameTree(TreeNode* root1,TreeNode* root2) { //root2==null说明整棵树都比较完了,说明所有点相同 if(root2==nullptr) return true; //root2非空,但root1为空,说明没有找到相同的点 if(root1=原创 2020-07-29 10:38:54 · 308 阅读 · 0 评论 -
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
方法1: 采用递归的思想(1)先确定合成的新链表的头节点(2) 再合并剩下的节点 ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { if(pHead1==nullptr) return pHead2; if(pHead2==nullptr) return pHead1; //判断节点大小,取小节点(要删除的节点)原创 2020-07-27 09:01:14 · 201 阅读 · 0 评论 -
输入一个链表,反转链表后,输出新链表的表头。
方法1: 定义三个指针,整体右移,边右移,边翻转,这样保证不会断链方法2: 定义一个新链表,采用头插的思想进行翻转方法3: 采用递归的思想:先反转当前节点后面的节点,然后将当前节点链接到反转部分的后面...原创 2020-07-27 08:56:04 · 700 阅读 · 0 评论 -
组队竞赛 c++编程
题目描述:链接:https://www.nowcoder.com/questionTerminal/6736cc3ffd1444a4a0057dee89be789b?orderByHotValue=1&page=1&onlyReference=false来源:牛客网牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。例如:一个队伍三个队员的水平值原创 2020-07-20 21:01:11 · 1086 阅读 · 0 评论 -
调整数组顺序,使奇数在偶数的前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路: 采用插入排序的思想从前往后将偶数后移,空出的位置中放入奇数。 void reOrderArray(vector<int> &array) { if (array.empty()) return; int k=0; for(in原创 2020-07-20 16:54:34 · 75 阅读 · 0 评论 -
旋转数组的最小数字
题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路: 采用二分法的思想当由于数组是非递减的,所以将数组前面旋转至数组尾部后,可以将旋转后的数组看成两部分,前后两部分均是非递减的,且前半部分整体大于等于后半部分。所以定义如下:left代表数组最左侧第一个元素的下标原创 2020-07-20 15:36:43 · 67 阅读 · 0 评论 -
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
int firstUniqChar(string s) { int cout[256]={0}; int len =s.size(); //统计每个字符出现的次数 for (int i=0;i<len;i++) { cout[s[i]]+=1; } //遍历找到出现一次的字符,并返回索引。否则,返回-1 for(int i=0;i<len;i++)原创 2020-07-18 10:52:24 · 2269 阅读 · 0 评论 -
把字符串转为整数
题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0思路: 从题意“整数”中可以看出,当字字符串中只包含‘+’、‘-’、以及0~9的数时,字符串才有效。 int StrToInt(string str) { int len=str.size(); if (len<=0) return 0; int i=0; int flag=0; //正负标原创 2020-07-18 10:13:11 · 74 阅读 · 0 评论 -
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
题目描述: 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。思路: 从两个字符串的末尾开始,分别取一位,并将字符类型转为数字类型,将转换后的两个数字相加记为cur,cur%10得到cur的个位数,并将其转为字符形式存入字符串res中,在对cur=cur/10得到是十位数(即进位),将其与字符串的倒数第二位相加,依次类推,直到两个字符串中都为空,然后将最后得到的字符串res逆序。string addStrings(string num1, string num2) {string原创 2020-07-17 16:01:11 · 2089 阅读 · 0 评论 -
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
思路: 两个数按位与,并左移两位,得到进位两个数按位异或,得到不带进位的两个数之和 int Add(int num1, int num2) { if(num1==0) return num2; if (num2==0) return num1; //两数相与左移一位是进位 int s1=(num1&num2)<<1; //两数原创 2020-07-16 10:13:53 · 123 阅读 · 0 评论 -
数组中重复的数字
题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。思路: 使用将数组中的数字及出现次数放在map中,判断map中是否存在出现次数大1的数字。 bool duplicate(int numbers[], int length, int* duplication) {原创 2020-07-16 09:28:37 · 122 阅读 · 0 评论 -
根据输入的日期,计算是这一年的第几天:输入某年某月某日,判断这一天是这一年的第几天?
**题目描述:**输入某年某月某日,判断这一天是这一年的第几天?#include<iostream>using namespace std;//前几个月的天数累计(闰年)const int days[] = {0,31,60,91,121,152,182,213,244,274,305,335,366 };//每月的天数(闰年)const int MonthDay[]={0,31,29,31,30,31,30,31,31,30,31,30,31};int getoutDay(int原创 2020-07-15 20:58:19 · 672 阅读 · 0 评论 -
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
C++实现实现思路:参考类的属性,类在创建对象时会调用构造函数,所以在类中实现一个内部类,创建对象时会调用构造函数可实现累加和class Solution {public: //内部类 class Sum { public: Sum() { sum=sum+i; i++; } }; int Sum_Solution(int n) {原创 2020-07-15 19:31:31 · 198 阅读 · 0 评论