目录

剑指 Offer 03. 数组中重复的数字

剑指 Offer 04. 二维数组中的查找

剑指 Offer 05. 替换空格

剑指 Offer 06. 从尾到头打印链表

剑指 Offer 07. 重建二叉树

剑指 Offer 09. 用两个栈实现队列

剑指 Offer 10- I. 斐波那契数列

剑指 Offer 10- II. 青蛙跳台阶问题

剑指 Offer 11. 旋转数组的最小数字

剑指 Offer 12. 矩阵中的路径

剑指 Offer 14- I/14- II. 剪绳子

剑指 Offer 15. 二进制中1的个数

剑指 Offer 16. 数值的整数次方

剑指 Offer 17. 打印从1到最大的n位数

剑指 Offer 18. 删除链表的节点

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

剑指 Offer 22. 链表中倒数第k个节点

剑指 Offer 24. 反转链表

剑指 Offer 25. 合并两个排序的链表

剑指 Offer 26. 树的子结构

剑指 Offer 27. 二叉树的镜像

剑指 Offer 28. 对称的二叉树

剑指 Offer 29. 顺时针打印矩阵

剑指 Offer 30 包含min函数的栈


剑指 Offer 03. 数组中重复的数字

搜索

剑指 Offer 04. 二维数组中的查找

二叉搜索树

剑指 Offer 05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1:

输入:s = "We are happy."
输出:"We%20are%20happy."

限制:

0 <= s 的长度 <= 10000

递归写法比较简单,注意写法,避免重复计算,时间复杂度O(n)

class Solution {
public:string replaceSpace(string s) {for(int i=0;i<s.length();i++)if(s[i]==' ')return s.substr(0,i)+"%20"+replaceSpace(s.substr(i+1,s.length()-i-1));return s;}
};

剑指 Offer 06. 从尾到头打印链表

链表

剑指 Offer 07. 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

3
   / \
  9  20
    /  \
   15   7

限制:

0 <= 节点个数 <= 5000

class Solution {
public:TreeNode* buildTree(vector<int>& preorder,int s1, vector<int>& inorder, int s2, int len) {if(len<=0)return NULL;TreeNode *ans=new TreeNode;ans->val=preorder[s1];auto loc=find(inorder.begin()+s2,inorder.begin()+s2+len,preorder[s1]);ans->left=buildTree(preorder,s1+1,inorder,s2,loc-inorder.begin()-s2);ans->right=buildTree(preorder,loc-inorder.begin()-s2+s1+1,inorder,loc-inorder.begin()+1,len-(loc-inorder.begin()-s2)-1);return ans;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {return buildTree(preorder,0,inorder,0,inorder.size());}
};

剑指 Offer 09. 用两个栈实现队列

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

示例 1:

输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:

输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
提示:

1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用

思路:

把2个栈的栈底连起来,就像2个杯子合起来,中间打穿就变成了一根管子

class CQueue {
public:CQueue() {        }void appendTail(int value) {s1.push(value);}int deleteHead() {int ans;if(s2.size()){ans=s2.top();s2.pop();return ans;}if(!s1.size())return -1;while(s1.size()){s2.push(s1.top());s1.pop();}return deleteHead();}
private:stack<int>s1,s2;
};

剑指 Offer 10- I. 斐波那契数列

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:

输入:n = 2
输出:1
示例 2:

输入:n = 5
输出:5

提示:

0 <= n <= 100

class Solution {
public:int fib(int n) {        static int ans[101]={0,1};if(n<2)return ans[n];if(ans[n])return ans[n];return ans[n]=(fib(n-1)+fib(n-2))%1000000007;}
};

剑指 Offer 10- II. 青蛙跳台阶问题

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:

输入:n = 2
输出:2
示例 2:

输入:n = 7
输出:21

class Solution {
public:int numWays(int n) {        static int ans[101]={1,1};if(n<2)return ans[n];if(ans[n])return ans[n];return ans[n]=(numWays(n-1)+numWays(n-2))%1000000007;}
};

剑指 Offer 11. 旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。

示例 1:

输入:[3,4,5,1,2]
输出:1
示例 2:

输入:[2,2,2,0,1]
输出:0

class Solution {
public:int minArray(vector<int>& nums) {if (nums.empty())return 0;int ans = nums[0];for (int i = 0; i < nums.size(); i++)ans = min(ans, nums[i]);return ans;}
};

剑指 Offer 12. 矩阵中的路径

题目:

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.

代码:


int flatRow[4] = { 0, -1, 0, 1 };
int flatCol[4] = { 1, 0, -1, 0 };bool existFromPointS(char** board, int boardSize, int* boardColSize, char * word,int rowS,int colS){if (word[0] == '\0'){return true; //word已经匹配完所有字符}if (rowS < 0 || rowS >= boardSize || colS < 0 || colS >= *boardColSize){return false; //越界}if (board[rowS][colS] != word[0]){ return false;//匹配当前字符}board[rowS][colS] = '\0';//赋值为word中肯定没有的字符,保证不被重用int i;for (i = 0; i < 4; i++){if (existFromPointS(board, boardSize, boardColSize, word + 1, rowS + flatRow[i], colS + flatCol[i])){return true;}}board[rowS][colS] = word[0];//复原,回溯return false;
}bool exist(char** board, int boardSize, int* boardColSize, char * word){int row, col;for (row = 0; row < boardSize; row++){for (col = 0; col < *boardColSize; col++){if (existFromPointS(board, boardSize, boardColSize, word, row, col)){return true;}}}return false;
}

PS:

不得不说参数的意思只能靠猜,boardSize是board的行数,*boardColSize是board的列数

剑指 Offer 14- I/14- II. 剪绳子

快速乘法、快速幂、矩阵快速幂_nameofcsdn的博客-CSDN博客

剑指 Offer 15. 二进制中1的个数

力扣 191. 位1的个数

剑指 Offer 16. 数值的整数次方

实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

示例 1:

输入: 2.00000, 10
输出: 1024.00000
示例 2:

输入: 2.10000, 3
输出: 9.26100
示例 3:

输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25

说明:

-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

template<typename A>
A opAdd(A x, A y)
{return x+y;
}
template<typename A>
A opMulti(A x, A y)
{return x*y;
}
template<typename A>
vector<vector<A>> opMatrixMulti(vector<vector<A>> x, vector<vector<A>> y)
{vector<vector<A>> ans=x;for(int i=0;i<ans.size();i++){for(int j=0;j<ans.size();j++){ans[i][j]=0;for(int k=0;k<ans.size();k++)ans[i][j]+=x[i][k]*y[k][j];}}return ans;
}template<typename A,typename N>
A aijiMulti(A a, N n, A(*pfunc)(A,A))
{if(n<=1)return a;A ans = aijiMulti(a, n/2, pfunc);ans = pfunc(ans,ans);if(n%2)ans = pfunc(ans,a);return ans;
}class Solution {
public:double myPow(double x, long long n) {if(n<0)return 1/myPow(x,-n);if(n==0)return 1;return aijiMulti(x,n,opMulti<double>);}
};

剑指 Offer 17. 打印从1到最大的n位数

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

示例 1:

输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]

说明:

用返回一个整数列表来代替打印
n 为正整数

class Solution {
public:vector<int> printNumbers(int n) {int len = pow(10, n) - 1;vector<int>ans(len);for (int i = 0; i < len; i++)ans[i] = i + 1;return ans;}
};

剑指 Offer 18. 删除链表的节点

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。

返回删除后的链表的头节点。

注意:此题对比原题有改动

示例 1:

输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:

输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.

说明:

题目保证链表中节点的值互不相同
若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点

class Solution {
public:ListNode* deleteNode(ListNode* head, int val) {if (head->val == val)return head->next;ListNode* p = head;while (p->next->val != val)p = p->next;p->next = p->next->next;return head;}
};

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

示例:

输入:nums = [1,2,3,4]
输出:[1,3,2,4] 
注:[3,1,2,4] 也是正确的答案之一。

提示:

1 <= nums.length <= 50000
1 <= nums[i] <= 10000

 class Solution {public:vector<int> exchange(vector<int>& nums) {vector<int>ans(nums.size());int k = 0;for (int i = 0; i < nums.size(); i++)if (nums[i] % 2)ans[k++] = nums[i];for (int i = 0; i < nums.size(); i++)if (nums[i] % 2 -1)ans[k++] = nums[i];return ans;}};

剑指 Offer 22. 链表中倒数第k个节点

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。

示例:

给定一个链表: 1->2->3->4->5, 和 k = 2.

返回链表 4->5.

class Solution {
public:ListNode* getKthFromEnd(ListNode* head, int k) {ListNode* p=head;while(p && k--)p=p->next;while(p)p=p->next,head=head->next;return head;}
};

剑指 Offer 24. 反转链表

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

限制:

0 <= 节点个数 <= 5000

ListNode * Reverse(ListNode *p)//链表反转,返回新的head
{if(p==NULL)return p;ListNode * q1;ListNode * q2;q1=p->next, p->next=NULL;while(q1){q2=q1->next, q1->next=p, p=q1, q1=q2;}return p;
}class Solution {
public:ListNode* reverseList(ListNode* head) {return Reverse(head);}
};

剑指 Offer 25. 合并两个排序的链表

单链表

剑指 Offer 26. 树的子结构

题目:

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如:
给定的树 A:

3
    / \
   4   5
  / \
 1   2
给定的树 B:


  /
 1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

示例 1:

输入:A = [1,2,3], B = [3,1]
输出:false
示例 2:

输入:A = [3,4,5,1,2], B = [4,1]
输出:true
限制:

0 <= 节点个数 <= 10000

代码:

class Solution {
public:bool isSubStructure(TreeNode* A, TreeNode* B)    {return (A && B)? isSubStructure2(A, B) || isSubStructure(A->left, B) || isSubStructure(A->right, B):false;}bool isSubStructure2(TreeNode* A, TreeNode* B) {return (A && B) ? A->val == B->val && isSubStructure2(A->left, B->left) && isSubStructure2(A->right, B->right) : !B;}
};

剑指 Offer 27. 二叉树的镜像

翻转一棵二叉树。

示例:

输入:

4
   /   \
  2     7
 / \   / \
1   3 6   9
输出:

4
   /   \
  7     2
 / \   / \
9   6 3   1

class Solution {
public:TreeNode* mirrorTree(TreeNode* root) {if(!root)return root;TreeNode *p=root->left,*q=root->right;root->left=q,root->right=p;mirrorTree(p);mirrorTree(q);return root;}
};

剑指 Offer 28. 对称的二叉树

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

1
   / \
  2   2
 / \ / \
3  4 4  3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

1
   / \
  2   2
   \   \
   3    3

bool isSameTree(TreeNode* r1,TreeNode* r2)
{if(r1==NULL && r2==NULL)return true;if(r1==NULL || r2==NULL)return false;if(r1->val!=r2->val)return false;return isSameTree(r1->left,r2->left)&&isSameTree(r1->right,r2->right);
}
TreeNode* invertTree(TreeNode* root) {if(!root)return root;TreeNode *p=root->left,*q=root->right;root->left=q,root->right=p;invertTree(p);invertTree(q);return root;
}
TreeNode* copyTree(TreeNode* root)
{if(!root)return root;TreeNode *p=new TreeNode(root->val);p->left=copyTree(root->left);p->right=copyTree(root->right);return p;
}
class Solution {
public:bool isSymmetric(TreeNode* root) {return isSameTree(root,invertTree(copyTree(root)));}
};

剑指 Offer 29. 顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

限制:

0 <= matrix.length <= 100
0 <= matrix[i].length <= 100

int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};class Solution {
public:vector<int> spiralOrder(vector<vector<int>> matrix) {vector<int>ans;if(matrix.empty())return ans;int k=0,len=matrix.size()*matrix[0].size();int x=0,y=0;while(len--){if(x<0||x>=matrix.size()||y<0||y>=matrix[0].size()||matrix[x][y]==-1234567){x-=dx[k],y-=dy[k];k++,k%=4;x+=dx[k],y+=dy[k];}ans.push_back(matrix[x][y]);matrix[x][y]=-1234567;x+=dx[k],y+=dy[k];}return ans;}
};

剑指 Offer 30 包含min函数的栈

力扣 155. 最小栈

力扣OJ 剑指 Offer(1-30)相关推荐

  1. 力扣OJ 剑指 Offer II

    目录 剑指 Offer II 001. 整数除法 剑指 Offer II 002. 二进制加法 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数 剑指 Offer II 004. ...

  2. LeetCode力扣(剑指offer 41-68)

    目录 剑指 Offer 41. 数据流中的中位数 剑指 Offer 42. 连续子数组的最大和 剑指 Offer 43. 1-n 整数中 1 出现的次数 剑指 Offer 44. 数字序列中某一位的数 ...

  3. 力扣(LeetCode)剑指offer刷题笔记(java),已完结!!!

    文章目录 3.数组中重复的数字 4.二维数组中的查找 5.替换空格 6.从尾到头打印链表 7.重建二叉树 9.两个栈来实现一个队列 10-1.斐波那契数列 10-2.跳台阶 11.旋转数组的最小数字 ...

  4. 剑指offer系列-30.包含min函数的栈

    剑指offer系列第30题.包含min函数的栈 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中, 调用 min.push 及 pop 的时间复杂度都是 ...

  5. 剑指offer第二版答案详细版(带详细解题思路)

    1.滑动窗口的最大值(剑指offer原59题) 解题思路:其实是一个队列的问题,用一个队列去维护当前窗口中的所有元素:首先将超出窗口中的队头元素先删掉,然后将新的元素插入当前窗口中,插入时要判断新插入 ...

  6. 《剑指 Offer》题目汇总

    文章目录 1. 数组 2. 链表 3. 栈和队列 4. 哈希表 5. 字符串 6. 树 7. 堆 8. 回溯和深度优先搜索 9. 递归和循环 10. 双指针 11. 动态规划 12. 贪心算法 13. ...

  7. 剑指offer每日六题---------day five

    剑指offer题25:复制一个随机链表 RondomListNode* RandomLinkCopy(RondomListNode *head) {if (!head)return NULL;//头结 ...

  8. 剑指Offer面试题解总结21-30

    目录 剑指Offer(21~30) 调整数组顺序使奇数位于偶数前面 链表中倒数第k个节点 反转链表 合并两个有序的链表 树的子结构 二叉树的镜像 对称的二叉树 顺时针打印矩阵 包含min函数的栈 剑指 ...

  9. JS版剑指offer

    JS版剑指offer JS刷题总结 牛客网 递归算法的时间复杂度:递归的总次数*每次递归的数量. 递归算法的空间复杂度:递归的深度*每次递归创建变量的个数. 二叉树(12道): 剑指Offer(4): ...

最新文章

  1. AI视频行为分析系统项目复盘——技术篇1:Ubuntu 18.04部署编译OpenCV+contrib、TensorFlow2.1、CUDA10.1+cuDNN7.6.5、tensorRT6.0.1等
  2. linux命令之crontab定时执行任务【转】
  3. javafx 安装_JDK安装教程及环境配置
  4. ON TOP-N and pagination queries
  5. Python中is与==的使用区别详解
  6. java class private_Java class 中public、protected 、friendly、private的区别
  7. 测试markdown的发布
  8. .net中有效的使用Cache
  9. FFMpeg的avcodec_send_packet/avcodec_receive_frame是异步解码
  10. 【图像分割】基于matlab模糊聚类算法FCM图像分割【含Matlab源码 084期】
  11. wps 英文版_为什么现在我会推荐使用wps?
  12. 用graphviz画树状图(pdf、png)
  13. zcu106 固化_xilinx zcu106 vcu demo
  14. openwrt nas_【群晖】用群晖虚拟机安装New Pi(OpenWRT)软路由系统
  15. 药品集中采购系统mysql数据库数据_浙江省药品集中采购基础数据库资料申报说明及具体要求...
  16. 红米手机如何抓取蓝牙log。
  17. 四五百蓝牙耳机哪个好?500元以内音质最好的蓝牙耳机
  18. VMware Convert 使用
  19. SQL SERVER 20005 分布式事务配置
  20. 【渝粤题库】广东开放大学 电子商务职业技能 形成性考核

热门文章

  1. 独家:花呗上线聚合分期,与信用卡和解
  2. 老板电器携手华为HarmonyOS创新升级中国厨房新理念
  3. 《Python深度学习》3.4电影评论分类:二分类问题
  4. iOS/Android 纪念模式(黑白灰模式) 记录
  5. 2017国庆 济南清北学堂 8天乐
  6. twitter推文采集案例
  7. tensorflow机器学习之利用CNN卷积神经网络进行面部表情识别的实例代码
  8. 多商户商城系统功能拆解24讲-平台端分销会员
  9. pandas案例之消费金额和消费之间的关联与性别和吸烟与否的关系
  10. 从《天行九歌》到海盗问题