![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++剑指Offer刷题集
C_臻可爱呢
这个作者很懒,什么都没留下…
展开
-
面试题66:构建乘积数组
给定一个数组,A[0,1,2,3,4,5,6…n-1],构建一个数组B[0,1,2,3,4,5,6…n-1],其中B[i]=A[0]xA[1]xA[2]…A[i-1]xA[i+1]…xA[n-1];eg:A[5]={1,2,3,4,5},那么B[0]=2345,B[1]=1345,B[2]=1245,B[3]=1235,B[4]=123*4,所以构建出来的乘积数组为:B[5]={120,60,...原创 2020-03-19 15:19:40 · 173 阅读 · 0 评论 -
面试题60:n个骰子的点数(动态规划)
一、基本概念动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达...原创 2020-03-17 15:15:23 · 260 阅读 · 1 评论 -
面试题57:和为s的连续正数序列
抽象为双指针class Solution {public: vector<vector<int>> findContinuousSequence(int target) { vector<vector<int>>res; if(target<0)return res; int smal...原创 2020-03-15 14:58:07 · 119 阅读 · 0 评论 -
面试题56:数组中数字出现的次数
将数组中每个数的二进制的每一位都加起来,如果能够整除3那么就不是,如果不能整除3那么该位为唯一数的某一个位class Solution {public: int singleNumber(vector<int>& nums) { if(nums.size()<=0)return -1; int bitSum[32]={0}; ...原创 2020-03-15 12:13:39 · 71 阅读 · 0 评论 -
面试题49:丑数
一、暴力法从1开始对每一个数进行判断,是否可以连除2,3,5得到1,效率比较低class Solution {public: int nthUglyNumber(int index) { if(index<=0)return -1; int number=0; int count=0; while(count<...原创 2020-03-12 11:50:46 · 89 阅读 · 0 评论 -
面试题48:最长不含重复字符的子字符串
哈希表+双指针(效率较低)class Solution {public: int lengthOfLongestSubstring(string s) { int N=s.length(); if(N<=0)return 0; map<char,int>mmp; int R=0; int ...原创 2020-03-11 14:15:42 · 125 阅读 · 0 评论 -
面试题43:1~n整数中1出现的次数
一、算是一种暴力求解法int countNum(int n){ int count = 0; while (n) { if (n % 10 == 1)++count; n /= 10; } return count;}int GetNumberOf1(int n){ if (n <= 0)return 0; int count = 0; for (int ...原创 2020-03-08 15:23:40 · 142 阅读 · 0 评论 -
面试题42:连续子数组的最大和
一、累加遍历累加,比之前累加值大的更新结果res,当累加值小于0时,将下一个元素值赋予nCursum,一直遍历到最后class Solution {public: int maxSubArray(vector<int>& nums) { if(nums.size()==0) return 0; int nCu...原创 2020-03-07 13:50:07 · 79 阅读 · 0 评论 -
面试题41:数据流中的中位数
思路:利用最大堆,最小堆1、将数据平分给两个堆(平分时,因为会有奇偶差,所以两个堆的元素数量之差最大只能是1);2、采用奇偶插入,当容器中已插入元素(最大堆、最小堆数量之和)数量为偶数时,新元素插入最小堆,奇数时,新元素插入最大堆;3、因为需要两个堆顶元素来确定中位数,那么最小堆的元素都要比最大堆的元素要大(最小堆堆顶为该段最小值,最大堆堆顶为该段最大值),所以在偶数插入时,如果该元素比最大...原创 2020-03-07 10:23:31 · 122 阅读 · 0 评论 -
面试题40:最小的K个数
一:先排序,取前k个数class Solution {public: vector<int> getLeastNumbers(vector<int>& arr, int k) { vector<int>res; if(arr.size()==0)return res; sort(arr.begi...原创 2020-03-06 21:48:11 · 133 阅读 · 0 评论 -
面试题39:数组中出现次数超过一半的数字
一:摩尔投票法如果与保存的值相等times+1,不相等则times-1,如果times等于0,则result保存另外一个值,最后结束时;如果times大于0,则result保存的值就为超过一半的数值class Solution{public: int majorityElement(vector<int>& nums) { int res...原创 2020-03-06 20:54:45 · 81 阅读 · 0 评论 -
面试题38:字符串的排列
class Solution {public: vector<string> permutation(string s) { vector<string>res; if(s.size()==0)return res; sort(s.begin(),s.end());//排序,也可不排序,看需求 per...原创 2020-03-05 23:23:10 · 92 阅读 · 0 评论 -
面试题37:序列化二叉树
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ //中...原创 2020-03-05 20:59:45 · 136 阅读 · 0 评论 -
面试题36:二叉搜索树与双向链表
#include <iostream>struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* pLeft, * pRight; BinaryTreeNode(int _value) :m_nValue(_value), pLeft(nullptr), pRight(nullptr) {}};void ConvertNod...原创 2020-03-05 20:54:55 · 73 阅读 · 0 评论 -
面试题36:复杂链表的复制
原地进行复制:时间复杂度O(n),空间复杂度O(1)第一步:将链表节点复制,并将其链接 eg:1->2->3->4---------1->1->2->2->3->3->4->4第二步:将自由链接进行链接,N->S可转化为N->N’------>S->S’第三步:将原节点与复制节点分开,奇节点链接起来,偶节点链...原创 2020-02-26 21:15:32 · 84 阅读 · 0 评论 -
面试题34:二叉树中和为某一值的路径(递归 C++)
因为从根节点开始寻找,前序、中序、后序遍历中只有前序遍历的根节点首先出现,所以利用前序遍历的规则去进行寻找路径,当访问到一个节点时,就将节点的值加上,如果当路径和(currentSum)等于预期的值并且为叶节点的时候,将此路径压入容器(vector)中;如果访问到叶节点的路径和(currentSum)没有达到预期值,回退到上一个节点,路径和(currentSum)减去此节点的值,一直到遍历完所有的...原创 2020-02-25 22:40:05 · 127 阅读 · 0 评论 -
面试题33:二叉搜索树的后续遍历
例如{5,7,6,9,11,10,8};根据最后一个元素为根节点,二叉搜索树的左子节点比根节点小{5,7,6},右子节点比根节点大{9,11,10},依照这个规律,可进行一步步的分析class Solution {public: bool verifyPostorder(vector<int>& postorder) { if(pos...原创 2020-02-25 21:23:45 · 76 阅读 · 0 评论 -
面试题32:从上到下打印二叉树
利用队列容器:deque#include<iostream>#include<deque>struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* pLeft, * pRight; BinaryTreeNode(int _value) :m_nValue(_value), pLeft(nullptr), pRig...原创 2020-02-23 14:47:07 · 79 阅读 · 0 评论 -
面试题31:栈的压入、弹出序列
找出入栈序列与弹出序列的规律:栈的栈顶元素与弹出序列按照顺序指定元素进行比较,如果不相等,则继续入栈,如果当入栈序列栈顶元素不等于按顺序指定的弹出序列的元素,那么该弹出序列即为错误,当栈与弹出序列都一一对应(栈空,弹出序列完结)即正确。#include<iostream>#include<stack>bool isPopOrder(const int* pPush...原创 2020-02-23 14:05:52 · 153 阅读 · 0 评论 -
面试题30:包含min函数的栈
刚开始以为要完全模拟一个出stack出来,后面才发现原来可以用原有的stack进行操作得到栈中最小的元素,需要一个辅助栈,进入该栈的条件就是比辅助栈栈顶元素小,否则加入本时辅助栈的栈顶元素以补充位置,致使调用pop时,不会出现一个最小元素弹出后没有了次最小元素#include<iostream>#include<stack>template<class T&...原创 2020-02-22 20:21:19 · 137 阅读 · 0 评论 -
面试题29:顺时针打印矩阵
#include<iostream>#define Row 4#define Col 4void PrintArray(int (*number)[Col], int rows, int cols, int start){ int endY = rows - 1 - start; int endX = cols - 1 - start; for (int i = sta...原创 2020-02-22 17:41:59 · 89 阅读 · 0 评论 -
面试题28:对称的二叉树
#include<iostream>struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* pLeft, * pRight; BinaryTreeNode(int _value):m_nValue(_value),pLeft(nullptr),pRight(nullptr){}};//利用树的遍历性质,前遍历、中遍历、后...原创 2020-02-22 14:34:37 · 85 阅读 · 0 评论 -
面试题27:二叉树的镜像(递归+非递归)C++
#include<iostream>#include<stack>struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* pChildenLeft, * pChildenRight; BinaryTreeNode(int _value):m_nValue(_value),pChildenLeft(nullptr)...原创 2020-02-21 12:54:55 · 91 阅读 · 0 评论 -
面试题26:树的子结构
从树中递归找到与需要配对的根节点相同的节点,然后就往下遍历,如果判断不相等,则继续寻找#include<iostream>struct treeNode{ int m_nValue; treeNode* pLfet, * pRight; treeNode(int _Value) :m_nValue(_Value), pLfet(nullptr), pRight(nullp...原创 2020-02-20 21:04:48 · 91 阅读 · 0 评论 -
面试题25:合并两个排序的链表
#include<iostream>struct listNode{ int m_nValue; listNode* m_Next; listNode(int _Value) :m_nValue(_Value){}};listNode* merge(listNode* pHead1, listNode* pHead2){ if (pHead1 == nullpt...原创 2020-02-20 15:22:54 · 80 阅读 · 0 评论 -
面试题24:反转链表(非递归+递归)
三指针,保留当前的下一个节点,将当前节点的m_Next指向前一个节点,前一个节点移动到当前节点,当前节点移动到下一个节点#include<iostream>struct listNode{ int m_nValue; listNode* m_Next; listNode(int _value):m_nValue(_value){}};listNode* Rever...原创 2020-02-19 17:19:18 · 89 阅读 · 0 评论 -
面试题23:链表中环的入口节点
一、判断该链表是否有环使用双指针,前指针走得快,后指针走得慢,如果有环,前指针能够在后面追上慢指针#include<iostream>struct listNode{ int m_nValue; listNode* m_Next; listNode(int _value) :m_nValue(_value){}};listNode* MeetingNode(lis...原创 2020-02-19 13:49:56 · 70 阅读 · 0 评论 -
面试题22:链表中倒数第k个节点
//假如单链表有n个节点,倒数第k个节点,即为n-k+1;//利用双指针进行判断,前指针走到k-1的位置,即开头的k-1位置,然后让后指针跟前指针一起走//当前指针到达尾部的时候,后指针刚好到达倒数第K个节点#include<iostream>struct listNode{ int m_nValue; listNode* m_Next;};//假如单链表有n个节点...原创 2020-02-17 14:37:44 · 108 阅读 · 0 评论 -
面试题21:调整数组顺序使奇数位于偶数前面
一、针对奇数偶数这一种情况的解决方案#include<iostream>void ReorderOddEven(int* pData, int length){ if (length <= 0)return; int* pBegin = pData; int* pEnd = pData + length - 1; while (pBegin < pEnd)...原创 2020-02-17 13:21:28 · 171 阅读 · 0 评论 -
表示数值的字符串
#include<iostream>class isnumeric{public: isnumeric(const char* str); bool scanInteger(const char** str);//需要将指针进行偏移 bool scanUnsignedInteger(const char** str);};//字符串数值模式:A[.[B]][e|EC]...原创 2020-02-17 13:02:27 · 70 阅读 · 0 评论 -
面试题19:删除链表(排序)中重复的节点
#include<iostream>class Node{public: int m_pValue; Node* m_pNext; Node():m_pNext(nullptr){}};void deleteNode(Node* pHead){ Node* pPreNode = nullptr; Node* pNode = pHead; while (pNode...原创 2020-02-15 17:19:18 · 119 阅读 · 0 评论 -
面试题18:删除链表的节点
#include<iostream>class Node{public: int m_nValue; Node* m_pNext; Node() :m_pNext(nullptr){}};void deleteNode(Node* p_ListHead, Node* pToBeDeleted){ if (p_ListHead == null...原创 2020-02-15 16:34:56 · 149 阅读 · 0 评论 -
面试题17:打印从1到最大的n位数(C++)
一、一般解法(没有考虑到大数问题)void PrintToMaxOfNDigits(int n){ int number = 1; while (n--) number *= 10; for (int i = 1;i < number;++i) std::cout << i; std::cout << " ";}二、利用字符串数组解决大数问题...原创 2020-02-15 15:13:10 · 143 阅读 · 0 评论 -
面试题16:数值的整数次方
一、虽然计算能够显示正确结果,但是对无效输入(即基数为0且指数为负)不能够很好的标明出来,即可能会忽略isInvaildInput的一个表达#include<iostream>class c_Pow{ bool isInvalidInput; double result; int unsignedExponent;public: double g_Pow(double...原创 2020-02-13 12:12:01 · 99 阅读 · 0 评论 -
面试题15:二进制中1的个数(位运算)
使用&运算,使用标记的二进制1,左移判断每个位的1(如果将num数字右移,则可能判断不了负数,因为有符号位的存在)#include<iostream>int NumberOf1(int num){ int count = 0; unsigned int flag = 1; while (flag) { if (num & flag)count++;...原创 2020-02-12 21:57:29 · 200 阅读 · 0 评论 -
面试题14:剪绳子(动态规划+贪婪算法)C++
一、动态规划:应用动态规划之前要分析该问题是否能够将大问题分解成为小问题,分解的问题往往也具有最优解,如果把小问题的最优解组合起来能够得到问题的整体解,那么该问题可以使用动态规划去解决特点:从上往下分析,从下往上解决#include<iostream>class max_ProductCutting_solution{ int* products; int produc...原创 2020-02-12 21:18:12 · 553 阅读 · 0 评论 -
面试题13:机器人的运动范围(回溯、C++)
#include<iostream>using std::endl;using std::cout;using std::cin;class moveCount{ bool* visited; int _rows, _cols, _target;public: moveCount(int target, int rows, int cols); ~moveCoun...原创 2020-02-11 15:17:21 · 238 阅读 · 0 评论 -
面试题12:矩阵中的路径(回溯法)
回溯法:暴力法的升级版,它从解决问题每一步的所有可能选项里面系统地选择出一个可行的解决方案,回溯法非常适合由多个步骤组成的问题,并且每个步骤都有多个选项#include<iostream>using std::cin;using std::cout;using std::endl;class has_Path{public: bool hasPath(const ch...原创 2020-02-07 12:46:37 · 121 阅读 · 0 评论 -
面试题8-二叉树的下一个节点(C++从构建树、打印树、销毁树等code)
#include<iostream>struct BinaryTreeNode{ int n_mValue; BinaryTreeNode* n_pLeft; BinaryTreeNode* n_pRight; BinaryTreeNode* n_parent; BinaryTreeNode(int value) : n_mValue(value),n_parent...原创 2020-01-18 23:56:51 · 167 阅读 · 0 评论 -
面试题7:重建二叉树
#include<iostream>using std::endl;using std::cout;using std::cin;struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_Pleft; BinaryTreeNode* m_Pright;};BinaryTreeNode* ConstructCor...原创 2020-01-18 01:14:55 · 71 阅读 · 0 评论