剑指 Offer (第 2 版)

news/2024/5/20 5:35:36/文章来源:https://blog.csdn.net/zhoujiazhao/article/details/130155334

(简单)剑指 Offer 03. 数组中重复的数字

找出数组中重复的数字。

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例 1:

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3 

限制:

2 <= n <= 100000

  • 题解:
class Solution {
public:int findRepeatNumber(vector<int>& nums) {int i = 0;while(i < nums.size()){if (nums[i] == i){i++;continue;}if (nums[i] == nums[nums[i]])return nums[i];swap(nums[i], nums[nums[i]]);}return -1;}
};

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

减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

示例:

现有矩阵 matrix 如下:

[[1,   4,  7, 11, 15],[2,   5,  8, 12, 19],[3,   6,  9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]
]

给定 target = 5,返回 true

给定 target = 20,返回 false

限制:

0 <= n <= 1000

0 <= m <= 1000

  • 题解:
    c++
class Solution {
public:bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {if (matrix.size() <= 0)return false;int i = matrix.size() - 1;int j = 0;while (i >= 0 && j < matrix[0].size()){if (target < matrix[i][j])i--;else if (target > matrix[i][j])j++;else return true;};return false;}
};

(简单)剑指 Offer 05. 替换空格

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

示例 1:

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

限制:

0 <= s 的长度 <= 10000

  • 题解:

C++

class Solution {
public:string replaceSpace(string s) {int count = 0;for(auto ch: s)if (ch == ' ')count++;int len = s.size();s.resize(len + 2 * count);for (int i = len - 1, j = s.size() - 1; i < j; i--, j--)if (s[i] != ' ')s[j] = s[i];else{s[j] = '0';s[j - 1] = '2';s[j - 2] = '%';j -= 2;}return s;}
};

Golang

func replaceSpace(s string) string {ss := []byte(s)length := len(ss)count := 0for _, ch := range ss {if ch == ' ' {count++}}cmp := make([]byte, 2 * count)ss = append(ss, cmp...)for i, j := length - 1, len(ss) - 1; i < j; i, j = i - 1, j - 1 {if ss[i] != ' ' {ss[j] = ss[i]} else {ss[j] = '0'ss[j - 1] = '2'ss[j - 2] = '%'j -= 2 }}return string(ss)
}

(简单)剑指 Offer 06. 从尾到头打印链表

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

示例 1:

输入:head = [1,3,2]
输出:[2,3,1]

限制:

0 <= 链表长度 <= 10000

  • 题解:

C++

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:vector<int> reversePrint(ListNode* head) {std::vector<int> res;while(head){res.push_back(head->val);head = head->next;}int n = res.size();for (int i = 0; i < (n >> 1); i++)swap(res[i], res[n - 1 -i]);return res;}
};

Golang

/*** Definition for singly-linked list.* type ListNode struct {*     Val int*     Next *ListNode* }*/
func reversePrint(head *ListNode) []int {if head == nil {return make([]int, 0)}var arrys = make([]int, 0)for head != nil {arrys = append(arrys, head.Val)head = head.Next}length := len(arrys)for i := 0; i <= (length - 1) / 2; i++ {arrys[i], arrys[length - 1 - i] = arrys[length - 1 - i], arrys[i]}return arrys  
}

(中等)剑指 Offer 07. 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

示例 1:

tree

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]

示例 2:

Input: preorder = [-1], inorder = [-1]
Output: [-1]

限制:

0 <= 节点个数 <= 5000

  • 题解:
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
private:std::unordered_map<int, int> m_index;TreeNode* _buildTree(std::vector<int>& preorder, int preLeft, int preRight,std::vector<int>& inorder , int inLeft , int inRight){if (preLeft > preRight)return nullptr;int rootValue = preorder[preLeft];TreeNode* root = new TreeNode(rootValue);// root node value in inorder.int index = m_index[rootValue];// length of left subtree.int length = index - inLeft; // (index -1) - inLeft + 1 root->left = _buildTree(preorder, preLeft + 1, (preLeft + 1) + (length - 1),inorder, inLeft, index - 1);root->right = _buildTree(preorder, (preLeft + 1) + length, preRight,inorder, index + 1, inRight);return root;}
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int n = preorder.size();for (int i = 0; i < n; i++)m_index[inorder[i]] = i;return _buildTree(preorder, 0, n -1, inorder , 0, n -1);}
};

(简单)剑指 Offer 09. 用两个栈实现队列

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

示例 1:

输入:

["CQueue","appendTail","deleteHead","deleteHead","deleteHead"]
[[],[3],[],[],[]]
输出:[null,null,3,-1,-1]

示例 2:

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

提示:

  • 1 <= values <= 10000

  • 最多会对 appendTaildeleteHead 进行 10000 次调用

  • 题解:

class CQueue {
private:std::stack<int> m_stackA, m_stackB;void moveA2B() {while(!m_stackA.empty()){m_stackB.push(m_stackA.top());m_stackA.pop();}}
public:CQueue() {}void appendTail(int value) {m_stackA.push(value);}int deleteHead() {if (m_stackB.empty()) {if (m_stackA.empty())return -1;moveA2B();}int result = m_stackB.top();m_stackB.pop();return result;}
};/*** Your CQueue object will be instantiated and called as such:* CQueue* obj = new CQueue();* obj->appendTail(value);* int param_2 = obj->deleteHead();*/

(简单)剑指 Offer 10- I. 斐波那契数列

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(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) {if (n < 2)return n;int a = 0, b = 1, sum = 0;for (int i = 2; i <= n ; i++){sum = (a + b) % 1000000007;a = b;b = sum;}return sum ;}
};

(简单)剑指 Offer 10- II. 青蛙跳台阶问题

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

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

示例 1:

输入:n = 2
输出:2

示例 2:

输入:n = 7
输出:21

示例 3:

输入:n = 0
输出:1

提示:

0 <= n <= 100

  • 题解:
class Solution {
public:int numWays(int n) {if (n == 0) return 1;if (n == 1)return 1;int a  = 1, b = 1, r = 0;for (int i = 2; i <= n; i++){r = (a + b)%1000000007;a = b;b = r;}return r;}
};

(简单)剑指 Offer 11. 旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2][1,2,3,4,5] 的一次旋转,该数组的最小值为 1。

注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]]

示例 1:

输入:numbers = [3,4,5,1,2]
输出:1

示例 2:

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

提示:

  • n == numbers.length

  • 1 <= n <= 5000

  • -5000 <= numbers[i] <= 5000

  • numbers 原来是一个升序排序的数组,并进行了 1n 次旋转

  • 题解:

class Solution {
public:int minArray(vector<int>& numbers) {int low = 0;int high  = numbers.size() - 1;while (low < high){int pivot = low + ((high - low) >> 1);if (numbers[pivot] < numbers[high])high = pivot;else if (numbers[pivot] > numbers[high])low = pivot + 1;else high--;}return numbers[low];}
};

(中等)剑指 Offer 12. 矩阵中的路径

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false

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

例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。

word2

示例 1:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

示例 2:

输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false

提示:

  • m == board.length
  • n = board[i].length
  • 1 <= m, n <= 6
  • 1 <= word.length <= 15
  • boardword 仅由大小写英文字母组成

题解:

class Solution {
private:int m_columns, m_rows;bool dfs(vector<vector<char>>& board, string word, int i, int j, int index){if (i >= m_rows ||j >= m_columns ||i < 0 ||j < 0 ||board[i][j] != word[index])return false;if (index == word.size() - 1)return true;board[i][j] = '\0';bool result = dfs(board, word, i + 1, j, index + 1) || dfs(board, word, i - 1, j, index + 1) ||dfs(board, word, i, j + 1, index + 1) || dfs(board, word, i, j - 1, index + 1);board[i][j] = word[index];return result;}public:bool exist(vector<vector<char>>& board, string word) {m_rows = board.size();m_columns = board[0].size();for (int i = 0; i < m_rows; i++)for (int j = 0; j < m_columns; j++)if (dfs(board, word, i, j, 0))return true;return false;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_286420.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python实现图像的平移、镜像、旋转(不调用CV库)

python实现图像的平移、镜像、旋转&#xff08;不调用CV库&#xff09; 老师布置的作业。。。。。 平移图像 图像的平移在几何变换中算是最简单的变换之一&#xff0c;话不多说&#xff0c;直奔主题 由图可知&#xff0c;在opencv中图像的原点一般为左上角&#xff0c;设初始…

1 Spark的环境搭建

1 Spark的环境搭建 1.1 Windows - Spark安装 一、下载并安装软件 \1. 下载并安装Java8&#xff1a;https://www.oracle.com/java/technologies/downloads/ &#xff08;1&#xff09; 原因&#xff1a;Spark由Scala语言开发。而Scala代码会被编译成Java字节码。因此Spark的…

总结821

学习目标&#xff1a; 4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 学习内容&#xff1a; 暴力英语&#xff1a;早上背颂并默写第19篇文章《I always knew I was going to be rich》&#xff0c;还有两三篇就达成…

一图看懂 xlwt 模块:读写 Excel 文件的数据和格式信息, 资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 xlwt 模块&#xff1a;读写 Excel 文件的数据和格式信息, 资料整理笔记&#xff08;大全&#xff09;摘要模块图类关系图模块全展开【xlwt】统计常量模块1 xlwt.compat2 xl…

中核科技:科技匠心 智启未来

​  2023 年4月 13—15 日&#xff0c;2023年易派客工业品展览会、石油石化工业展览会、第七届中国石油和化工行业采购年会&#xff0c;在苏州国际博览中心胜利召开。本次展会展览面积53000平方米&#xff0c;参展企业500余家&#xff0c;汇集了中国工业制造领域的大型国企央…

第一章 webpack与构建发展简史

官方loader和插件 Loaders | webpack Plugins | webpack 为什么需要构建工具&#xff1f; 初识webpack webpack默认配置文件&#xff1a;webpack.config.js 可以通过webpack --config <config_file_name>指定配置文件 rules是个数组&#xff0c;一个打包配置可以有多…

直方图 颜色映射

文章目录hist map1. 原理2.灰度图3. 对于彩色图像4. 直方图规定化效果hist map 1. 原理 code:https://github.com/rossgoodwin/hmap 利用队列记录 hist src > tgt, src < tgt , src tgt的 索引。 然后&#xff0c;对于每个hist excess, 将其移动到 hist deficit 进行…

PS学习记录-基础操作与快捷键

1、复制图层 在【移动工具】状态下&#xff0c;配合【alt】按键拖动图像&#xff0c;可以进行复制图层 当然&#xff0c;PS里复制图层的方式很多&#xff0c;比如&#xff1a;选中图层&#xff0c;按【ctrlJ】&#xff0c;也是复制图层 2、多选图层 2.1同上&#xff0c;也是…

微信支付,JSAPI支付,APP支付,H5支付,Native支付,小程序支付功能详情以及回调处理

一.支付相关文档地址支付wiki&#xff1a;https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml支付api: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/index.shtml开发工具包(SDK)下载&#xff1a;https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay6_0.shtm…

【你听说了吗】GPT-5据说已经学完了世界上现存所有的视频

文章目录前言一、GPT-5会带来什么&#xff1f;二、我们该怎么办&#xff1f;总结前言 最近半年要说最火的产品&#xff0c;无疑是ChatGPT &#xff0c;很多同学都在用 GPT 帮助自己工作&#xff0c;学习&#xff0c;提高效率&#xff01;尤其是 GPT4&#xff0c;性能强 GPT3.5…

Thymeleaf select回显并选中多个

语法&#xff1a;${#strings.indexOf(name,frag)} 或者 ${#lists.contains(list, element)} 或者 ${#strings.contains(name,ez)} 或者 ${#strings.containsIgnoreCase(name,ez)} 多选语法 &#xff1a; <select class"required" data-live-search"true&…

Tomcat处理请求的全过程

文章目录一、组件详解二、请求处理流程1.总体流程图2.Worker线程任务流程三、源码跟踪1.Tomcat启动线程组件2.Acceptor3.Poller4.Worker总结一、组件详解 在Tomcat处理客户端请求的过程中&#xff0c;这里面有三个组件概念&#xff0c;他们都是线程&#xff0c;分别负责不同的…

能翻译大量文字的软件-正规的翻译软件

复制自动翻译软件是一种能够复制并自动翻译文本的工具。当您阅读某一种语言的文本时&#xff0c;这种软件可以快速识别并翻译出来&#xff0c;以方便您更好地理解内容。与其他翻译软件不同的是&#xff0c;复制自动翻译软件可以直接在游览网站的过程中&#xff0c;直接对用户正…

贝叶斯优化 | BO-RF贝叶斯优化随机森林多输入单输出回归预测(Matlab完整程序)

贝叶斯优化 | BO-RF贝叶斯优化随机森林多输入单输出回归预测(Matlab完整程序) 目录 贝叶斯优化 | BO-RF贝叶斯优化随机森林多输入单输出回归预测(Matlab完整程序)预测结果基本介绍评价指标程序设计参考资料预测结果 基本介绍 贝叶斯优化 | BO-RF贝叶斯优化随机森林多输入单…

全球6G技术大会总结报告

全球6G技术大会 论坛B&#xff1a;天地融合智能组网技术 论坛D&#xff1a;2030技术发展趋势 论坛E&#xff1a;6G无线空口传输技术 论坛F&#xff1a;6G通感算架构及关键技术 论坛H&#xff1a;6G网络架构及关键技术 论坛B&#xff1a;天地融合智能组网技术 论坛B中包含…

【大数据Hadoop】HDFS3.3.1-Namenode-租约管理

租约管理前言LeaseManager.LeaseLeaseManager添加租约 - addLease租约检查 - FsNamesystem.checkLease租约更新 - renewLease删除租约 - removeLease租约检查 - Monitor 线程租约恢复 - Monitor 线程发起租约恢复 - 其他方式发起前言 我们知道 HDFS 文件是 write-once-read-man…

C++的命名空间

C和C语言是有一些相似的地方的&#xff0c;而且C就是C语言的改进版本&#xff0c;所以学习C也得学习C语言&#xff0c;但是他们又是有很多不同的地方 下面我们就看一下C的命名空间 我们首先看一下 如果是这一段代码&#xff0c;那么这里输出的是多少呢&#xff1f; 很好这里输…

2023MathorcupC题电商物流网络包裹应急调运与结构优化问题建模详解+模型代码(一)

电商物流网络包裹应急调运与结构优化问题 第三次继续写数模文章和思路代码了&#xff0c;不知道上次美赛和国赛大家有没有认识我&#xff0c;没关系今年只要有数模比赛艾特我私信我&#xff0c;要是我有时间我一定免费出文章代码好吧&#xff01;博主参与过十余次数学建模大赛…

Flink时间属性

1.概述 Flink支持三种与流数据处理相关的时间概念&#xff1a;Processing Time、Event Time和Ingestion Time。具体如下图所示&#xff1a; 当前Flink仅支持Processing Time和Event Time EventTime&#xff1a;您提供的事件时间&#xff08;通常是数据的最原始的创建时间&…

大数据学习路线图(2023完整版)适合收藏

大数据开发是一门涉及处理和分析大规模数据的技术领域&#xff0c;随着大数据技术的不断发展和应用&#xff0c;对大数据开发人员的需求也在逐渐增加。就业前景相对较好&#xff0c;尤其在科技行业和数据驱动型企业中。大数据开发的前景还是有很多优势的&#xff0c;就业范围广…