![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++面试
文章平均质量分 90
coder-HRQ
课题分离
展开
-
归并排序(C++实现、递归、非递归)
(本博客旨在个人总结回顾)1.概括 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。2.实现C++递归和非...原创 2019-11-05 19:42:40 · 1327 阅读 · 0 评论 -
剑指Offer第44题(扑克牌的顺子)
(本博客旨在个人总结回顾)题目描述: 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。解题思路: 大小王使用0来表示,先将数组排序,然后计算0的个数,和非0已排序的相隔的两个数之间需要补充的个数。并排除对子(元素相等)的情况。源码:#incl...原创 2020-11-29 14:35:22 · 197 阅读 · 0 评论 -
剑指Offer第43题(n个骰子的点数)
(本博客旨在个人总结回顾)题目描述: 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能值出现的概率。解法一:递归解法#include "stdafx.h"#include<iostream>using namespace std;int g_maxValue = 6;void Probability(int or...原创 2020-11-29 14:35:09 · 155 阅读 · 0 评论 -
剑指Offer第42题(翻转单词顺序VS左旋转字符串)
(本博客旨在个人总结回顾)题目描述: 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student. a am I"。解题思路:通过两次翻转实现:①翻转一次:得到".tneduts a ma I"②翻转字符串中的每个单词: 得到"student. ...原创 2020-11-29 14:34:55 · 117 阅读 · 0 评论 -
剑指Offer第41题(和为s的两个数字VS和为s的连续正数序列)
(本博客旨在个人总结回顾)题目描述: 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,输入任意一对即可。 例如输入数组{1,2,4,7,11,15}和数字15。由于4+11=15,因此输出4和11.源码:#include "stdafx.h"#include<iostream>...原创 2020-11-29 14:34:36 · 152 阅读 · 0 评论 -
剑指Offer第40题(数组中只出现一次的数字)
(本博客旨在个人总结回顾)题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两遍。请些程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度是O(1). 例如输入数组{2,4,3,6,3,2,5,5},因为只有4,6这两个数字只出现一次,奇怪数字都出现了两次,所以输出4和6。解题思路:题目要求时间复杂度为O(n),空间复杂度为O(...原创 2020-11-29 14:34:15 · 120 阅读 · 0 评论 -
剑指Offer第39题(二叉树的深度)
(本博客旨在个人总结回顾)题目描述: 输入一颗二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。二叉树的结点定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; ...原创 2020-11-29 14:30:03 · 116 阅读 · 0 评论 -
剑指Offer第38题(数字在排序数组中出现的次数)
(本博客旨在个人总结回顾)题目描述: 统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。解题思路:①直接遍历数组,计算某个数字出现的次数。时间复杂度为O(n).<这肯定不是面试官想要的答案,这是个人都知道吧,可这个职位肯定不是是个人就能胜任的吧,其他题目也也可以参考这个思路~_...原创 2020-11-29 14:29:50 · 109 阅读 · 0 评论 -
剑指Offer第37题(两个链表的第一个公共结点)
(本博客旨在个人总结回顾)题目描述: 在输入两个链表,找出它们的第一个公共结点。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};根据上面的链表的结点可以得到若两个链表有公共结点,那它们的示意图如下:从而只要计算两条链表的长度,将较长链表先...原创 2020-11-29 14:29:36 · 99 阅读 · 0 评论 -
剑指Offer第36题(数组中的逆序对)
(本博客旨在个人总结回顾)题目描述: 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 例如在数组{7,5,6,4}中,一共存在5个逆序对,分别为(7,6)、(7,5)、(5,4)、(6,4)和(5,4)。解题思路:①比较直观的解法,遍历数组每个元素,若遍历到第n个元素,则遍历其后...原创 2020-11-29 14:29:23 · 135 阅读 · 0 评论 -
剑指Offer第35题(第一个只出现过一次的字符)
(本博客旨在个人总结回顾)题目描述: 在字符串中找到第一个只出现一次的字符。如输入"abaccdeff",这输出‘b’。解题思路:1、直接遍历字符串,访问到一个字符时,再遍历后边的字符,看看是否重复。若重复访问下一个字符。时间复杂度为O(n^2).2、使用哈希表存储信息,遍历一遍字符串时存储字符(key)及其出现的次数(value),再遍历一遍字符串,查哈希表val...原创 2020-11-29 14:29:09 · 107 阅读 · 0 评论 -
剑指Offer第34题(丑数)
(本博客旨在个人总结回顾)题目描述: 我们把只包含因子2、3和5的数称为丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,但14不是,因为她包含因子7。习惯上我们把1当做第一个丑数。书上提供两种做法:1、比较直观,直接遍历自然数,判断该值是否有丑数,找到第1500个丑数;解法一:(效率太低)#include ...原创 2020-11-29 14:28:56 · 102 阅读 · 0 评论 -
剑指Offer第33题(把数组排成最小的数)
(本博客旨在个人总结回顾)题目描述: 输入一个整数数组,把数组里所有的数字拼接一起排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组 {3,32,321},则打印出这3个数字能排成的最小数字321323.解题思路:(此解法存在大数问题,将等同数组转换为字符串就可以避开大数问题。)将数组转换为位数相同的等同数组,将其排序,(特殊值,比如0,不能放在第...原创 2020-11-29 14:28:38 · 111 阅读 · 0 评论 -
剑指Offer第32题(从1到n整数中1出现的次数)
(本博客旨在个人总结回顾)题目描述: 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。解题思路:1、若从1~n去计算每一个数出现的1的次数,再加起来,时间复杂度为O(n^2),根据数学y=x^2方程,n 较大时效率是非常低的。2、所以正确的解法只能从1出现的规律来...原创 2020-11-29 14:28:24 · 148 阅读 · 0 评论 -
剑指Offer第31题(连续子数组的最大和)
(本博客旨在个人总结回顾)题目描述: 输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n). 例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出该子数组的和为18.解法一:#include "stdafx....原创 2020-11-29 14:28:10 · 96 阅读 · 0 评论 -
剑指Offer第30题(最小的k个数)
(本博客旨在个人总结回顾)题目描述: 输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,这最小的4个数字是1、2、3、4。解法一:与29题解法一类似,类似快速排序将部分排序,找出下标为最小k,输入其左边数组元素即可。#include "stdafx.h"#include<iostream>using namespac...原创 2020-11-29 14:27:55 · 104 阅读 · 0 评论 -
剑指Offer第29题(数组中出现次数超过一半的数字)
(本博客旨在个人总结回顾)题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2, 2,5,3,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.解法一:需要改变数组类似快速排序,找出下标为n/2#include "stdafx.h"#include<iostream>...原创 2020-11-29 14:27:41 · 87 阅读 · 0 评论 -
剑指Offer第28题(字符串的排列)及相关题目(组合、八皇后问题)
(本博客旨在个人总结回顾)题目描述: 输入一个字符串,打印出该字符串中字符的所有排列。例如输入abc,则打印出右字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba.知识点:排列: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列...原创 2020-11-29 14:27:27 · 142 阅读 · 0 评论 -
剑指Offer第27题(二叉搜索树与双线链表)
(本博客旨在个人总结回顾)题目描述: 输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。比如输入图4.12中左边的二叉搜索树,则输入转换之后的排序双向链表。#include "stdafx.h"#include <iostream>#include <map>using n...原创 2020-11-29 14:27:11 · 131 阅读 · 0 评论 -
剑指Offer第26题(复杂链表的复制)
(本博客旨在个人总结回顾)题目描述: 请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任意结点或者NULL. 结点的C++定义如下:struct ComplexListNode...原创 2020-11-29 14:26:54 · 110 阅读 · 0 评论 -
剑指Offer第25题(二叉树中和为某一值的路径)
(本博客旨在个人总结回顾)题目描述: 输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶结点所经过的结点形成一条路径。二叉树结点 的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; Bina...原创 2020-11-29 14:26:28 · 117 阅读 · 0 评论 -
剑指Offer第24题(二叉搜索树的后序遍历)
(本博客旨在个人总结回顾)题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。 例如输入数组{5,7,6,9,11,10,8},则返回true,因为这个整数序列是图4.6二叉树的后序遍历结果。如果输入的数组是{7,4,6,5},由于没有哪棵二叉搜索树的后序...原创 2020-11-29 14:26:13 · 86 阅读 · 0 评论 -
剑指Offer第23题(从上往下打印二叉树)
(本博客旨在个人总结回顾)题目描述: 从上往下打印二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如输入图4.5中的二叉树,则依次打印8、6、10、5、7、9、11。 二叉树结点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLe...原创 2020-11-29 14:25:59 · 88 阅读 · 0 评论 -
剑指Offer第22题(栈的压入、弹出序列)
(本博客旨在个人总结回顾)题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。解题思路: 分别使用两个指针指向压栈序列和弹出序列,使用...原创 2020-11-29 14:25:43 · 94 阅读 · 0 评论 -
剑指Offer第21题(包含min函数的栈)
(本博客旨在个人总结回顾)题目描述: 定义栈的数据结构,请在改类型中实现一个能够得到栈的最小元素的min函数。在改栈中,调用min、push及pop的时间复杂度都是O(1)。解题思路:当题目思路不清晰时可使用画图或表格来模拟步骤,并慢慢发现其中的规律。栈内压入3、4、2、1之后接连两次弹出栈顶数字再压入0时,数据栈、辅助栈和最小值状态 步骤 操作 数据...原创 2020-11-29 14:25:29 · 124 阅读 · 0 评论 -
剑指Offer第20题(顺时针打印矩阵)
(本博客旨在个人总结回顾)题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如 :如果输入如下矩阵:解题思路:问题明显需要需要和判断临界条件来输出结果。所以需要清晰打印思路:一层一层打印,先打印出第一层,再打印出第二层,依次打印完。完整代码:#include "stdafx.h"#include <iostream&...原创 2019-11-28 19:12:34 · 153 阅读 · 0 评论 -
剑指Offer第19题(二叉树的镜化)
(本博客旨在个人总结回顾)题目描述: 请完成一个函数,输入一个二叉树,该函数输出它的镜像。二叉树结点定义如下:struct BinaryTreeNode{ int m_pValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};...原创 2020-11-29 14:25:09 · 93 阅读 · 0 评论 -
剑指Offer第18题(树的子结构)
(本博客旨在个人总结回顾)题目描述: 输入两棵二叉树A和B,判断B是不是A的子结构。二叉树结点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};解题思路:理...原创 2020-11-29 14:24:53 · 120 阅读 · 0 评论 -
剑指Offer第17题(合并两个排序的链表)
(本博客旨在个人总结回顾)题目描述: 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入图3.7的链表1和链表2.则合并之后的升序链表如链表3所示。链表结点定义如下:struct ListNode{ int m_nValue; ListNode* m_pNext;};解法一:...原创 2020-11-29 14:24:39 · 107 阅读 · 0 评论 -
剑指Offer第16题(反转链表)
(本博客旨在个人总结回顾)题目描述: 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。链表结点定义如下:struct ListNode{ int m_nValue; ListNode* m_pNext;};解题思路:通过三个指针分别指向连续的三个链表结点,并改变指向,依次遍历完链表。...原创 2020-11-29 14:24:03 · 113 阅读 · 0 评论 -
剑指Offer第15题(链表中倒数第k个结点)
(本博客旨在个人总结回顾)题目描述: 输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。链表结点定义如下:struct ListNode{ int m_nVa...原创 2020-11-29 14:23:50 · 88 阅读 · 0 评论 -
剑指Offer第14题(调整数组顺序使奇数位于偶数前面)
(本博客旨在个人总结回顾)题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半 部分,所有偶数位于数组的后半部分。解法一:/* * @name ReorderOddEven * @brief 调整数组,使得数组奇数在偶数前面 * @param [in] int * array * @return void *...原创 2020-11-29 14:23:34 · 99 阅读 · 1 评论 -
剑指Offer第13题(在O(1)时间删除链表结点)
(本博客旨在个人总结回顾)题目描述: 给定单向链表的头指针也一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下:struct ListNode{ int m_nValue; ListNode* m_pNext;};void DeleteNode(ListNode** pListHead, ListNod...原创 2020-11-29 14:22:15 · 84 阅读 · 0 评论 -
剑指Offer第12题(打印1到最大的n位数)
(本博客旨在个人总结回顾)题目描述: 输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1、2、3一直到最大的3位数即999。解题思路:看似特别简单的题目,越是面试官挖坑给你跳。因为题目的解法真的特别简单,根本就没有面试的需要。一般这样看似简单的问题,但没有规定数字范围,往往就是考大数问题,大数问题一般可用字符解决。解法一:(使用字符串模拟加...原创 2020-11-29 14:23:10 · 127 阅读 · 0 评论 -
剑指Offer第11题(数值的整数次方)
(本博客旨在个人总结回顾)题目描述: 实现函数double Power(double base, int exponent),求base的exponse次方。不得使用库函数,同时不需要考虑大数问题。解题思路: 首先从数学的定义去分析该题:①任何非0的0次方等于1.②base^exponent当exponent为负数值有base^exponent=1....原创 2020-11-29 14:22:49 · 108 阅读 · 0 评论 -
剑指Offer第10题(二进制中1的个数)
(本博客旨在个人总结回顾)题目描述: 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2。解法一:/* * @name NumberOf1InBinary * @brief 数字用二进制表示中1的个数(数字和1做位的与操作,并右移) * @param [in] int nN...原创 2020-11-29 14:42:42 · 126 阅读 · 0 评论 -
剑指Offer第9题(斐波那契数列)
(本博客旨在个人总结回顾)题目描述: 写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。斐波那契数列的定义如下:解题思路:①递归可以解决该问题,但使用递归重复计算某些数据,效率较低。(比如f(n)=f(n-1)+f(n-2) 而f(n-1)=f(n-2)+f(n-3),而这里的f(n-2)就重复计算了)#include "stdafx.h"#...原创 2020-11-29 14:22:30 · 176 阅读 · 0 评论 -
剑指Offer第7题(用两个栈实现队列)
(本博客旨在个人总结回顾)题目描述: 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。template <typename T> class CQueue{public: CQueue(void); ~CQueue(void); ...原创 2019-11-17 18:17:34 · 120 阅读 · 0 评论 -
剑指Offer第6题(重建二叉树)
(本博客旨在个人总结回顾)题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中不含有重复的数字。例如输入前序遍历序列为{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1, 5, 3, 8, 6},这重建出如下图所示的二叉树并输出他的头结点。二叉树结点的定义如下:...原创 2019-11-13 22:59:54 · 123 阅读 · 0 评论 -
剑指Offer第5题(从尾到头打印链表)
(本博客旨在个人总结回顾)题目描述: 输入一个链表的头结点,从尾到头反过来打印出每一个结点的值。 链表结点第一如下: struct ListNode { int m_nKey; ListNode* m_pNext;...原创 2019-11-12 14:54:30 · 187 阅读 · 0 评论