剑者offer
剑指offer思路与代码
小麦大大
写写代码纪录生活
展开
-
两数之和题
算法原创 2022-07-27 17:22:59 · 113 阅读 · 0 评论 -
链表内指定区间反转
算法练习原创 2022-07-27 16:58:59 · 332 阅读 · 0 评论 -
判断一个链表是否为回文结构
练习算法原创 2022-07-27 16:54:27 · 189 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
1.题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。2.思路要求稳定性的解法: 借鉴冒泡排序思想,每次确定一个位置。class Solution { public: void reOrderArray(vector<int> &array...原创 2018-08-27 18:12:26 · 156 阅读 · 0 评论 -
旋转数组的最小数字(二分查找)
1.题目旋转数组的最小数字:输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 注意:给出的所有元素都大于0,若数组大小为0,请返回0。2、简单法:class Solution { public: int minNumberInRotateArray...原创 2018-08-27 18:26:38 · 294 阅读 · 0 评论 -
二维数组中的查找
1.题目在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数数组和一个整数,判断数组中是否含有该整数。 #思路 首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数组,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数...原创 2018-08-27 18:33:51 · 132 阅读 · 0 评论 -
找出数组中任意重复的数字(不修改数组)
题目在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。例如,如果输入长度为8的数组{2,3,5,4,3,2,6,7},那么对应的输出是重复的数字2或者3。思路借鉴二分查找的思想,将数字1~n拆分成1~m和m+1~n两部分,如果数字范围1~m中数字个数大于m,则重复数字在1~m中间,否则重复...原创 2018-08-27 19:41:22 · 498 阅读 · 0 评论 -
把数组排成最小的数
1、题目2、思路1.排序 寻找数组元素排序规则,使得数组根据这个规则排序之后,数组元素能排成一个最小的数。排序规则如下: 若ab > ba, 则 a 大于 b, 若ab < ba ,则 a 小于 b, 若ab = ba ,则 a 等于 b;2.拼接 给出数字m和n,怎么得到数字mn和nm并比较两者大小?如果使用数字计算,容易出现...原创 2018-08-26 04:04:09 · 151 阅读 · 0 评论 -
连续子数组的最大和
题目输入一个整形数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值,时间复杂度为O(n)。思路分析计算连续子数组最大和的规律。下图是我们计算数组(1,-2,3,10,-4,7,2,-5)中子数组的最大和的过程。设置两个辅助变量,累加子数组和cur_sum、最大子数组和max_sum。初始的累加子数组和cur_sum为数组的第一个元素,初始...原创 2018-08-26 04:12:11 · 148 阅读 · 0 评论 -
数组中最小的K个数
题目输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4思路基于Partition的思路 时间复杂度为O(n)基于红黑树的思路 辅助容器:定义用于遍历向量的辅助容器–迭代器ite;定义用于存储结果的辅助容器–多重集合res。 基本思路:首先创建一个大小为k的容器,用来存储最小的k...原创 2018-08-26 04:17:31 · 478 阅读 · 0 评论 -
数组中出现次数超过数组长度一半的数字
题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 举例:输入一个长度为9的数组{1,2,3,2,2,2,5,4,2},由于数字2在数组中出现了5次,超过数组长度一半,因此输出2。思路解法一:允许修改输入的...原创 2018-08-26 04:27:24 · 258 阅读 · 0 评论 -
顺时针打印矩阵
1.题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵,则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.2.思路把矩阵看成由若干个顺时针方向的圈组成,循环打印矩阵中的每个圈,每次循环打印一个圈。打印一圈通常分为四步,第一步从左到右打印一行;第二步从上到下打印一列;第三步从右到左打印一行;第四步从...原创 2018-08-26 04:43:39 · 151 阅读 · 0 评论 -
和为s的连续正数序列
题目思路设置两个辅助变量small和big,small表示序列的最小值,big表示序列的最大值。如果sum(small ~ big) > s,则增大small的值。如果sum(small ~ big) < s ,则增大big的值。因为序列要求至少两个数字,所以small增加到(s+1)/2为止。 #include <iostream>#inc...原创 2018-08-25 16:21:45 · 158 阅读 · 0 评论 -
和为s的两个数字
1、题目2、思路首先定义两个指针,第一个指针p指向数组的第一个数字,第二个指针q指向数组的最后一个数字。如果p+q=s,则找到要找的数字;如果p+q #include <iostream> #include <vector> using namespace std; /* 输入一个递增排序的数组和一个数字s,在数组中查找两个...原创 2018-08-25 16:24:56 · 182 阅读 · 0 评论 -
第一个只出现一次的字符
1.题目2.思路 空间换时间。建立一个Map,第一次扫描字符串时,统计每个字符的出现次数。第二次扫描字符串时,返回第一个只出现一次字符的位置。class Solution {public: void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { // 特殊...原创 2018-08-25 16:34:32 · 142 阅读 · 0 评论 -
数字在排序数组中出现的次数
1、题目2、思路利用二分查找法,查找元素k在排序数组中第一次出现的位置m及最后一次出现的位置n,m-n+1即为元素k再排序数组中出现的次数。二分查找法在数组中找到第一个k的思路:先拿数组中间元素mid和查找元素k比较,如果k < mid,则第一个k只可能出现在数组的前半段;如果k>mid,则第一个k只可能出现在数组的后半段;如果k=mid,则先判断中间元素是不是第一...原创 2018-08-25 16:43:15 · 168 阅读 · 0 评论 -
翻转单词顺序
1、题目2、思路两次翻转,第一次翻转整个句子,第二次翻转每个单词(单词之间用逗号隔开)#include <iostream>#include <string>using namespace std;class Solution {public: string ReverseSentence(string str) { ...原创 2018-08-20 15:09:49 · 187 阅读 · 0 评论 -
左旋转字符串
1、题目2、思路先局部翻转,后整体翻转。举例:abcdefg先局部翻转为bagfedc,后整体翻转为cdefgab。#include <iostream>#include <string>using namespace std;class Solution {public: string LeftRotateString(strin...原创 2018-08-20 15:14:05 · 198 阅读 · 0 评论 -
字符串转换为数字
1、 题目把字符串转换成整数2、思路1.功能测试正数/复数/02.边界值测试最大的正整数/最小的负整数(数据上下溢出)3.特殊输入测试空字符串“”的处理,返回0,设置非法输入 字符串只有符号位的处理,返回0,设置非法输入 输入的字符串中有非数字字符,返回0,设置非法输入class Solution {public: int StrToInt...原创 2018-08-20 15:24:03 · 703 阅读 · 0 评论 -
表示数值的字符串
1、题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。2、思路我们首先分析一下子可能是数值的字符串的格式 在数值之前可能有一个表示正负的’-‘或者’+’。 接下来是若干个...原创 2018-08-20 15:34:16 · 181 阅读 · 0 评论 -
剑指offer--替换空格
一、题目题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。二、代码块代码块语法遵循标准markdown代码,例如:class Solution {public: void replaceSpace(char *str,int length) {...翻译 2018-08-08 09:07:29 · 146 阅读 · 0 评论 -
剑指offer--二维数组中的查找
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学这里写代码片公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl...翻译 2018-08-08 08:04:58 · 98 阅读 · 0 评论 -
从尾到头打印链表
1.题目输入一个链表,从尾到头打印链表每个节点的值2.思路不改变链表结构的情况下,首先,遍历链表将链表结点值存入栈中;然后,从栈顶逐个输出结点的值到向量 struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x...原创 2018-08-16 04:16:38 · 119 阅读 · 0 评论 -
链表中倒数第k个节点
1、题目输入一个链表,输出该链表中倒数第k个结点。链表的尾节点是倒数第一个节点。2、思路两个指针遍历链表:第一个指针从链表的头节点走k-1步,第二个指针不动;从第k步开始,第二个指针也开始从链表的头节点开始遍历,直到第一个指针指向链表结尾。由于两个指针的距离保持k-1,当第一个指针到达链表的尾节点时,第二个指针指向倒数第k个节点。鲁棒性:1.输入k=0时,输出nullptr...原创 2018-08-16 04:23:37 · 446 阅读 · 0 评论 -
反转链表
1、题目输入一个链表的头结点,首先反转链表后,然后输出链表的所有元素2、思路辅助指针:定义三个用于翻转链表的辅助指针和一个用于表示翻转链表头结点的指针,node指向当前节点、left指向当前节点的前一个节点、right指向当前节点的下一个节点、ReverseHead指向翻转链表的头结点。翻转链表过程:循环翻转链表,每次循环翻转一个结点。判断node是否是最后一个结点,如果是最后...原创 2018-08-16 04:54:07 · 158 阅读 · 0 评论 -
合并两个单调递增的链表
1.题目输入两个单调递增的链表,输出两个链表合成后的链表(单调不减)。2.思路(递归)鲁棒性: 如果链表1是空链表,则直接输出链表2。 如果链表2是空链表,则直接输出链表1。递归思路:定义三个指针,指向链表1头结点的指针p1,指向链表2头结点的指针p2,指向合并后链表头节点的指针head。比较p1和p2的值,如果p1 < p2,那么head指向p1,...原创 2018-08-16 05:11:14 · 359 阅读 · 0 评论 -
两个链表的第一个公共结点
1、题目输入两个链表,找出它们的第一个公共结点。2、例子如、链表一 1 2 3 6 7 链表二 4 5 6 7 它们的第一个公共子结点为6。思路第一次遍历两个链表得到两个链表的长度,以及两个链表长度的差值error;第二次遍历两个链表时,先在较长的链表上走error步,接着分别遍历两个链表,找到的第一个相同的节点即为第一个公共节点,时间复杂度为O(m+n)。比如在上...原创 2018-08-16 05:36:20 · 117 阅读 · 0 评论 -
重建二叉树
1、题目输入某二叉树的前序遍历和中序遍历的结果,重建二叉树2、思路前序遍历中,第一个数字是二叉树的根节点 中序遍历中,根节点的左侧是左子树的节点,根节点的右侧是右子树的节点。 返回值:指向二叉树节点的指针 函数参数:前序遍历结果vector,中序遍历结果vector struct TreeNode { int val; TreeNode *...原创 2018-08-16 14:03:37 · 153 阅读 · 0 评论 -
二叉树的下一个节点
1、题目2、 思路如果节点有右子节点,则右子节点的最左节点是该节点的下一个节点。例如,寻找b的下一个节点的过程(b有右子节点e,e的左子节点是h,且h是e的最左节点,h是b的下一个节点) 如果节点无右子节点,但该节点是父节点的左子节点,则父节点是该节点的下一个节点。例如,寻找d的下一个节点的过程(d无右子节点,d是父节点b的左子节点,则b是de的下一个节点) 如果节点无右子节点...原创 2018-08-16 14:18:25 · 113 阅读 · 0 评论 -
二叉树的子结构
1、题目2、思路查找二叉树B是否是二叉树A的子结构,可以分为两步: 第一步,递归遍历树A,在树A中找到和树B的根节点的值一样的节点R。递归出口是遍历完二叉树A或在树A中找到和树B结构一样的子树。 树A为空的时候,输出false 树B为空的时候,输出false 第二步,递归遍历树A的子树,判断树A中以R为根节点的子树是不是包含和树B一样的结构。递归出口是到达树A或者树B的叶节...原创 2018-08-16 14:28:47 · 1355 阅读 · 0 评论 -
二叉树的镜像(先序遍历)
1、题目2、思路二叉树有0个节点 二叉树有1个节点 二叉树有多个节点(普通二叉树和只有单侧子节点的二叉树) 二叉树有多个节点的思路:前序遍历二叉树的每个节点,如果遍历到的节点有子节点,则交换该节点的两个子节点。当交换完所有非叶子结点的左右节点之后,即得到二叉树的镜像。 struct TreeNode { int val; ...原创 2018-08-16 14:37:00 · 655 阅读 · 0 评论 -
对称二叉树
1、题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。 struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left...原创 2018-08-17 00:31:43 · 114 阅读 · 0 评论 -
不分行从上到下打印二叉树(层序遍历)
1、题目从上往下打印出二叉树的每个节点,同层节点从左至右打印。例如: 2.思路本题使用队列做为辅助容器,利用队列的先进先出策略,按层打印二叉树。举例:首先,将根节点压入队列;然后,先将队首元素放入存储遍历结果的vector中,再判断队首节点是否有左右子节点,如果有左右子节点,则将做右子节点压入队列,队首元素弹出队首,循环执行直至队列为空。最后,将存储遍历结果的vector返回。...原创 2018-08-17 00:31:05 · 153 阅读 · 0 评论 -
把二叉树打印成多行
1、题目从上到下按层打印二叉树,同一层结点从左至右输出,每一层输出一行。例如:下面二叉树的打印结果为: 2.思路本题目使用队列和两个变量作为辅助,利用队列的先进先出策略,按层遍历二叉树。队列保存将要打印的节点,一个变量表示当前层中还没有打印的节点数,一个节点表示下一层节点的数目。struct TreeNode { int val; struct Tree...原创 2018-08-17 00:28:24 · 154 阅读 · 0 评论 -
之字形打印二叉树
1.题目请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。 2.思路本题使用两个栈作为辅助容器。打印某一层节点时,把下一层的子节点保存到栈内。如果当前打印的是奇数层,则先保存左子树节点再保存右子树节点到第一个栈内;如果当前打印的是偶数层,则先保存右子树在保存左子树节点到第二个栈内。...原创 2018-08-17 00:27:26 · 303 阅读 · 0 评论 -
二叉树中和为某一值的路径
1、题目输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径由结点和有向边组成,从根结点到叶节点。2、例子2.思路本题使用前序遍历的方式访问节点,使用二维向量result存储全部路径,使用一维向量tmp存储当前路径。遍历二叉树的过程:按前序遍历顺序访问每一个节点。访问每个结点时,将结点添加到路径向量tmp中。如果当前结点是叶子结点,则判断当前路径...原创 2018-08-17 00:46:59 · 105 阅读 · 0 评论 -
判断一个序列是否是二叉搜索树的后序遍历
1、题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 举例:序列{5,7,6,9,11,10,8}是下图二叉搜索树的后序遍历结果。2、思路性质: 二叉排序树的性质:左子树上所有节点的值均小于它的根节点;右子树上所有节点的值均大于它的根节点。 二叉排序树后序遍历的性质:序列最后一...原创 2018-08-17 01:16:17 · 336 阅读 · 0 评论 -
二叉搜索树转双向链表
1、题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }class Solutio...原创 2018-08-17 01:37:55 · 168 阅读 · 0 评论 -
输入一颗二叉树的根节点,求二叉树的深度
1、题目2、思路class Solution {public: int TreeDepth(TreeNode* pRoot) { if(pRoot == nullptr) return 0; int left = TreeDepth(pRoot->left); int right...原创 2018-08-17 01:44:39 · 1415 阅读 · 0 评论 -
包含min函数的栈
1.题目定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。在该栈中调用push、pop、top、min的时间复杂度都是o(1)。思路定义一个辅助栈,用于存放数据栈每次入栈时的最小元素,辅助栈的栈顶元素是数据栈内最小值。 举例:创建一个空数据栈和空辅助栈。 1.数据栈中压入3,辅助栈为空栈,最小值为3,辅助栈压入3 2.数据栈中压入4,4大于辅助栈的...原创 2018-08-18 00:36:18 · 124 阅读 · 0 评论