![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指Offer
i_actor
一只学C++的菜鸡。
展开
-
剑指Offer刷题 - 反转链表、合并两个排序链表、树的子结构、二叉树的镜像、顺时针打印矩阵
反转链表题目描述:输入一个链表,反转链表后,输出新链表的表头。示例:采用头插法插入就行了。代码:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* ReverseList(ListNode* pHead) { if(!pHead)return原创 2021-02-05 21:49:14 · 85 阅读 · 0 评论 -
剑指Offer刷题 - 二维数组中的查找
题目描述:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:我主要考虑了两种解法,分别是暴力遍历和分排进行二分查找,时间复杂度分别为O(n^2)和O(nlogn).由于暴力太过简单就不说了,直接遍历数组比较就行了。二分代码如下:class Solution {public: bool binSearch(const int &ta原创 2021-02-01 17:24:04 · 70 阅读 · 0 评论 -
剑指Offer刷题 - 链表中倒数第k个节点
题目描述:输入一个链表,输出该链表中倒数第k个结点。示例:本题在考虑效率的情况下,采用两个指针来遍历,快指针先前进k,然后两个同步前面,直到快指针走到了尾部停下来,然后返回慢指针。代码如下:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* FindKthToT原创 2021-02-03 19:40:15 · 68 阅读 · 0 评论 -
剑指Offer刷题 - 调整数组顺序使奇位数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。本题方法听多了,可以采用冒泡(O(n2)),也可以插入。当然也可以用空间换时间。本题我就是采用空间换取时间的方法;代码如下:class Solution {public: void reOrderArray(vector<int> &array) { vector<int&原创 2021-02-03 19:30:27 · 58 阅读 · 0 评论 -
剑指Offer刷题 - 数值的整数次方
题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0示例:本题就是求base的exponent次方,可以直接调用pow函数就行了。代码如下:class Solution {public: double Power(double base, int exponent) { return pow(base, exponent); }};...原创 2021-02-03 18:47:25 · 69 阅读 · 0 评论 -
剑指Offer刷题 - 二进制中1的个数
题目描述:输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。示例:本题中就转化成二进制然后数1的个数就行了,当为负数的时候,用无符号int来表示int就行了。代码如下:class Solution {public: int NumberOf1(int n) { int count = 0; unsigned int num = n; while(num > 0) {原创 2021-02-03 18:44:00 · 70 阅读 · 0 评论 -
剑指Offer刷题 - 矩形覆盖
题目描述:我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?示例:本题我是通过找规律发现还是一个斐波拉契数列。代码就比较简单了,如下:class Solution {public: int rectCover(int number) { int dp[1001] = {0, 1, 2}; for(auto i = 3; i <= number; i++)原创 2021-02-03 18:39:39 · 70 阅读 · 0 评论 -
剑指Offer刷题 - 变态跳台阶
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。示例:本题中dp(n) = dp(n-1) + dp(n-2) + dp(n-3) + … + dp(1) + dp(0);(dp(0) = 1, dp(1) = 1) 《==》 dp(n) = 2 * dp(n-1)(n != 1)代码如下:class Solution {public: int jumpFloorII(int number) {原创 2021-02-02 19:30:13 · 58 阅读 · 0 评论 -
剑指Offer刷题 - 跳台阶
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。示例:本题就是一个斐波拉契数列,即f(n) = f(n-1) + f(n-2)代码如下:class Solution {public: int jumpFloor(int number) { int dp[10001] = {0,1,2}; for(auto i = 3; i <= number; i++)原创 2021-02-02 19:10:23 · 66 阅读 · 0 评论 -
剑指Offer刷题 - 斐波那契数列
题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n≤39示例:本题比较经典做法很多,由于n比较小,可以直接暴力就行。只要明白f(n)=f(n-1) + f(n-2)这一公式就行了。代码如下:class Solution {public: int Fibonacci(int n) { int dp[50] = {0, 1}; for(auto i=2; i<= n; i++原创 2021-02-02 19:05:44 · 81 阅读 · 0 评论 -
剑指Offer刷题 - 旋转数组的最小数字
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。示例:本题主要采取二分的方法,由于最开始是有序的,经过旋转后,相当于把两个有序的数组进行结合,只需要考虑中间数字和两边数字的比较就行了。代码:class Solution {public: int minNumberInRotateArray(vector<int> rotat原创 2021-02-02 19:00:17 · 72 阅读 · 0 评论 -
剑指Offer刷题 - 用两个栈实现队列
题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。个人理解:本题要求用两个栈实现队列的入队和出队操作。入队:由于栈是后进先出,队列是先进先出。所以当两个栈堆叠起来时,就能实现先进先出。只需要把数据放入到stack1中,然后再顺序输出放入到stack2中,但由于需要考虑到连续进入的情况,所以在放入到stack2中之前,需要把stack2中所有的元素都放回到stack1中。出队:同理,考虑到连续出队的情况,在拿出一个元素后,需要再把stack1中的元素再放回原创 2021-02-01 19:09:46 · 113 阅读 · 0 评论 -
剑指Offer刷题 - 重建二叉树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。示例:本题按照先序和中序来重建二叉树,个人思路就是顺序遍历先序的结果,然后把每一次的先序放入到中序中,将在中序的位置为pos,从low到pos-1就构成了该节点的左子树,pos+1到high构成了该二叉树的右子树。然后递归即可。代码如下:/** * D原创 2021-02-01 18:45:02 · 58 阅读 · 0 评论 -
剑指Offer刷题 - 从尾到头打印链表
题目描述:输入一个链表,按链表从尾到头的顺序返回一个ArrayList。示例:本题由于要求返回一个vector,只需要从头到尾遍历链表,然后将链表的值插入到vector的头部就行了。难度比较小。代码如下:/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) :* val(x), next(NULL) {* }原创 2021-02-01 17:44:00 · 64 阅读 · 0 评论 -
剑指Offer刷题 - 替换空格
题目描述:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。本题比较简单,个人思路就是遇到空格直接插入替换就行了,没有什么难度。class Solution {public: void insert(char *str, int i, int length) { int j; for(j = length -1; j>= i+2; j--)原创 2021-02-01 17:38:04 · 55 阅读 · 0 评论