刷题-从零开刷
刷题是每个码农的必经之路,如果感到迷茫,那就刷题吧~~
2014到2015年间,我曾有机会认真的刷题,但我没有把握机会。如今转眼2018年,希望今年能够收获满满。
35岁前,做一名勤奋的码农。
Li_GaoGao
这个作者很懒,什么都没留下…
展开
-
牛客网刷题|复杂链表的复制
题目来源:牛客网链接网址题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解题思路:先保存一版正常链表复制随机链表使用递归和非递归的方法/*struct RandomListNode { in...原创 2019-03-17 12:25:32 · 258 阅读 · 0 评论 -
牛客网刷题|数组中只出现一次的数字
题目来源:牛客网编程连接题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。题目解析: 使用异或,两个相同的数字异或会等于0; 若只存在一个数,一直异或就会把这个数生下来; 若两个数,一直异或,这两个不同的数异或之后会生成一个数,某位上一定会出现1,则表示这个位上,两数不同;根据这个位,将数组分成两组,每组...原创 2018-05-08 23:44:13 · 426 阅读 · 0 评论 -
牛客网刷题|平衡二叉树
题目来源:牛客网编程连接题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。题目解析: 平衡二叉树的概念:左右子树的深度相差不大于1即可。 根据上一题,求树的深度即可调用。代码:class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { if(...原创 2018-05-08 17:37:17 · 538 阅读 · 0 评论 -
牛客网刷题|两个链表的第一个公共结点
题目来源:牛客网编程连接题目描述 输入两个链表,找出它们的第一个公共结点。题目解析: 1、比较两者的长度,长的先走,之后一起走,走到两个相同的时候即是第一个公共结点 2、两个指针分别指向这两个结点,不同的时候,则往前走,相同则停。代码: 1、先求长度class Solution {public: ListNode* FindFirstCom...原创 2018-05-07 23:45:41 · 235 阅读 · 0 评论 -
牛客网刷题|二叉树的深度
题目来源:牛客网编程连接题目描述 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。题目解析: 递归的思路,左子树的深度和右子树的深度,深的加1即可。代码:class Solution {public: int TreeDepth(TreeNode* pRoot) {...原创 2018-05-07 08:42:15 · 196 阅读 · 0 评论 -
牛客网刷题|第一个只出现一次的字符
题目来源:牛客网编程连接题目描述 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置题目解析; 用map记录每个字符的次数,返回次数为1的的位置。代码:class Solution {public: int FirstNotRepeatingChar(string str) {...原创 2018-05-06 20:42:16 · 233 阅读 · 0 评论 -
牛客网刷题|连续子数组的最大和
题目来源:牛客网编程连接题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为...原创 2018-05-06 12:39:39 · 209 阅读 · 0 评论 -
牛客网刷题|最小的K个数
题目来源:牛客网 编程连接题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。题目解析: 很容易想到先排序,之后取前K个树即可,但是得排除总数没有K个得情况 1、直接用sort排序 2、那么用multiset(不能用set,set会去重)和priority_queue也是可以做的...原创 2018-05-06 10:20:50 · 677 阅读 · 1 评论 -
牛客网刷题|数组中出现次数超过一半的数字
题目来源:牛客网 编程连接 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解析: 设立一个flag,出现一次则cnt加1,不同则减1,当cnt为0的时候,更新flag。到最后的flag即是出现次数...原创 2018-05-06 09:53:59 · 691 阅读 · 0 评论 -
牛客网刷题|二叉树中和为某一值的路径
题目来源:牛客网编程连接题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。解析: 经典DFS算法,深度优先算法class Solution {public: vector<vector<int> > FindPath(Tree...原创 2018-05-04 20:39:31 · 507 阅读 · 0 评论 -
牛客网刷题|二叉搜索树的后序遍历序列
题目来源:牛客网编程连接题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解析: 考虑到后续遍历的特点,最后一个元数时是根结点 前面的几个会小于根节点,是左子树 后面的几个会大于根节点,是右子树 用递归和非递归都可以递归代码:class Sol...原创 2018-05-02 08:43:50 · 370 阅读 · 0 评论 -
牛客网刷题|从上往下打印二叉树
题目来源:牛客网 编程连接题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印。解析: 使用队列,其实就是二叉树的层序遍历,利用一个队列就可以实现了,具体点说就是BFS。代码:class Solution {public: vector<int> PrintFromTopToBottom(TreeNode* root) {...原创 2018-05-01 23:26:46 · 236 阅读 · 0 评论 -
牛客网刷题|栈的压入、弹出序列
题目来源:牛客网 编程连接题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解析: 用一个栈保存压入数据,分...原创 2018-05-01 22:38:36 · 308 阅读 · 0 评论 -
牛客网刷题|包含min函数的栈
题目来源:牛客网 编程连接题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。解析: 要在O(1)的时间复杂度内得到最小值。那么只能空间换时间了; 设置一个数据栈,一个辅助栈,辅助栈中存储的是每一步的最小值,当前状态的最小值就是辅助栈的栈顶元素,即 把元素压入数据栈时,比较辅助栈栈顶元素和压入的元素的大小,如果压入的元素比...原创 2018-05-01 22:05:19 · 203 阅读 · 0 评论 -
牛客网刷题|二叉树的镜像
题目来源:牛客网 编程连接题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 ...原创 2018-05-01 21:10:11 · 187 阅读 · 0 评论 -
牛客网刷题|树的子结构
题目来源:牛客网 编程链接题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解析: 可以想见整个过程:1、A,B首先看根节点对不对,如果对了,看根节点的左右结点对不对。 2、若第一个根节点没有配对成功,则换成A的左子结点来配对。 3、若左子结点没有成功,则换成A的右子结点来配对。代码:/*s...原创 2018-05-01 20:50:03 · 242 阅读 · 0 评论 -
牛客网刷题|合并两个排序的链表
题目来源:牛客网 编程链接题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解析: 用递归的思路。代码:class Solution {public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { if(pH...原创 2018-05-01 17:45:18 · 315 阅读 · 0 评论 -
牛客网刷题|输入一个链表,输出该链表中倒数第k个结点。
题目来源:牛客网 编程链接题目描述: 输入一个链表,输出该链表中倒数第k个结点。解析: 使用两个指针,一个指针先走K-1步,之后同时走。当先走的指针到到最后时,第二个指针也就到倒数第K个结点了。代码:class Solution {public: ListNode* FindKthToTail(ListNode* pListHead, unsig...原创 2018-05-01 17:23:31 · 836 阅读 · 0 评论 -
牛客网刷题|反转链表
题目来源:牛客网 编程链接题目描述: 输入一个链表,反转链表后,输出链表的所有元素。解析: 反转列表主要考察对列表的熟悉程度,有递归和非递归两种写法;递归代码:class Solution {public: ListNode* ReverseList(ListNode* pHead) { if(pHead == nullptr||...原创 2018-05-01 17:17:00 · 346 阅读 · 0 评论 -
牛客网刷题|调整数组顺序使奇数位于偶数前面
题目来源:牛客网 编程链接题目说描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解答: 注意到题目要求相对位置不变,这样的话最好用一个辅助数组来做。 先遍历一遍原数组,记录奇数的个数,创建一个新数组 再遍历一遍原数组,遇到奇数则...原创 2018-04-30 15:50:12 · 459 阅读 · 0 评论 -
牛客网刷题|重建二叉树
题目来源:牛客网 编程链接题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。题目解析: 知道前序和中序遍历的结果是可以唯一确定一颗二叉树的,但是知道前序和后序遍历是不可以唯一确...原创 2018-04-30 15:08:57 · 703 阅读 · 1 评论 -
牛客网刷题|数值的整数次方
题目来源:牛客网 编程链接题目: 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解析: 二分求解,速度块: baseexp=(baseexp/2)2∗(base or 1)baseexp=(baseexp/2)2∗(base or 1)base ^{exp} = {(...原创 2018-04-30 13:17:53 · 272 阅读 · 0 评论 -
牛客网刷题|二进制中1的个数
题目来源:牛客网 编程链接题目: 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解析: 比如输入9。二进制是1001,则输出2;(两个1) 我们需要想办法消除二进制种的1,利用n &= (n - 1)就可以做到。 然后看一下消了几次n变成0,次数就是答案。 n &= (n - 1)具体的操作,是把最后一位的1变成0,而...原创 2018-04-30 12:22:07 · 279 阅读 · 0 评论 -
牛客网刷题|矩形覆盖
题目来源:牛客网 编程链接题目: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解析: 假设最后一块是竖着放的,则前面有f(n-1)种方法排满,图1 假设最后一块是横着放的,则前面只有f(n-2)种方法排满,图2 图三是不存在,不存在2*2的矩阵。 则公式很简单:f(...原创 2018-04-30 11:39:29 · 232 阅读 · 0 评论 -
牛客网刷题|变态跳台阶
题目来源:牛客网 编程链接题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解析: 最简单的动态规划,考虑最后跳上第n阶台阶,有n种方式往上跳: 从第n - 1阶往上跳一级到第n阶; 从第n - 2阶往上跳二级到第n阶; 从第n - 3阶往上跳3级到第n阶;… 那么f(i)表示该...原创 2018-04-30 11:20:16 · 234 阅读 · 0 评论 -
牛客网刷题|跳台阶
题目来源:牛客网 编程链接题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解析: 先假设几级台阶看看数字规律:f1(表示1级台阶时候):1(表示1种跳法) f1:1 f2:2(要么跳一次两级,或者两次一级) f3:f1 + f2;(最后一级台阶,假设跳一级完成,则前面需要跳分f2,若跳两级完成,则需要跳...原创 2018-04-30 11:02:19 · 172 阅读 · 0 评论 -
牛客网刷题|斐波那契数列
题目来源:牛客网 编程链接斐波拉契数列的特点: 1,1,2,3,5,8,11…. 后一个数等于前两个数之和,很多书在第一次介绍递归算法的时候都会介绍斐波拉契数列, 代码如下:class Solution {public: int Fibonacci(int n) { if(0 >= n) return 0; i...原创 2018-04-30 10:51:42 · 705 阅读 · 0 评论 -
牛客网刷题|旋转数组的最小数字
题目来源:牛客网 编程链接 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。如果不考虑选择数组的特殊性,说白了,题目就是求数组的最小值。所以我试着暴力求解:...原创 2018-04-30 10:05:08 · 230 阅读 · 0 评论 -
牛客网刷题|二叉树的深度
题目来源: 牛客网 编程链接 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。解答:用递归的思路很简单,递归求左子树和右子树的深度取最长的,加上根节点的1即可。代码如下:/*struct TreeNode { int val; struct TreeNode *left; str...原创 2018-04-27 08:57:34 · 199 阅读 · 0 评论 -
牛客网刷题|丑数
题目来源: 牛客网 编程链接 题目描述 把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。考虑丑数和丑数之间的关系 把丑数按大小顺序排序,第1500个即是所求。 思考过程: 第一个丑数是1; 第二个丑数是(1*2;1*3;1*5)三者之间的最小值。即是...原创 2018-04-26 08:35:18 · 353 阅读 · 0 评论 -
牛客网刷题|用两个栈实现队列
牛客网第七题:编程链接: 题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 用一个栈专门来完成push操作; 用另一个栈来完成pop操作,如果这个栈为空,那么就把第一个栈的元素依次出栈然后入栈到该栈,由于元素在第一个栈中是先入后出,经过转移的步骤,元素就变成了先入先出了,满足队列的性质。解题: 首先得清楚栈和队列的基本概念,栈是...原创 2018-04-24 23:58:07 · 289 阅读 · 0 评论 -
牛客网刷题|矩阵中的路径
题目来源: 牛客网 这里写链接内容 这是别人的解法,看起来不是很直观..class Solution {public: bool hasPath(char* matrix, int rows, int cols, char* str) { int i; bool used[(const int)strlen(matrix)]; ...原创 2018-03-18 15:57:23 · 312 阅读 · 0 评论 -
牛客网刷题|机器人的运动范围
题目来源: 牛客网 编程链接地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?这道题考察的是B...原创 2018-03-17 23:23:45 · 448 阅读 · 0 评论 -
牛客网刷题|连续子数组的最大和
题目来源: 牛客网 编程链接 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会...原创 2018-03-17 00:13:18 · 481 阅读 · 0 评论 -
牛客网刷题|最小的K个数
题目来源: 牛客网 编程链接输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。先简单的把数组排序,求前K个即可,考虑输入数组个数小于K的情况class Solution {public: vector<int> GetLeastNumbers_Solution(vector<in...原创 2018-03-16 23:43:06 · 216 阅读 · 0 评论 -
牛客网刷题|数组中出现次数超过一半的数字
题目来源: 牛客网: 编程连接: 第28题数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解析: 记录第一个数记成flag,cnt=1,若下一个数还是这个数,则cnt+1,若不是,cnt-1;当cnt=0,把flag更新成...原创 2018-03-16 09:42:50 · 221 阅读 · 0 评论 -
牛客网刷题|从尾到头打印链表
题目来源:牛客网 编程地址: 第三题 输入一个链表,从尾到头打印链表每个节点的值。 将链表从尾到投打印出来,很容易想到用stack来做。先入后出的特性。 将链表先一个个存进去,在一个个取出来。stack可以是int的也可以是ListNode 的,看你存什么了。 解法(3ms)class Solution {public: vector&amp;lt;int&amp;gt; print...原创 2018-03-14 23:13:44 · 260 阅读 · 0 评论 -
牛客网刷题|替换空格
题目来源:牛客网 编程链接: 第二题 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 解法: 调用内嵌函数realloc,扩大字符串长度。 从字符串后面往前传。class Solution {public: void replaceSpace(char *str...原创 2018-03-14 22:50:04 · 200 阅读 · 0 评论 -
牛客网刷题|二维数组中的查找
题目来源牛客网: 编程链接 第一题 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解法1(9ms):暴力遍历整个二维数组,从右上或者左下开始,遇到的这个数若比目标数大,则目标数在这个数左边(列–),遇到小,则目标数在这个数下面(行++)。 使得运动方向唯一可控。class原创 2018-03-14 22:33:50 · 193 阅读 · 0 评论 -
牛客网刷题|从上往下打印二叉树
这个题在leetcode里也有的 题目大意: 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 c++*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL...原创 2018-03-11 09:10:20 · 228 阅读 · 0 评论