![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
文章平均质量分 93
萌萌滴太阳
语言是沟通的工具,文字是记录存证的工具,而文字化的过程,又可以让思考彻底沉淀,善于使用文字的人,通常是深沉而严谨的。
展开
-
Java编程刷题常用
类型变换数据结构堆Java 中提供了现成的类 PriorityQueue,默认是小根堆,实现大根堆需要重写一下比较器。PriorityQueue<Integer> pq = new PriorityQueue<>((v1 , v2) -> v2 - v1);原创 2021-05-29 22:19:15 · 1095 阅读 · 0 评论 -
OJ在线编程常见输入输出练习,hasNext()和hasNextLine()方法的区别
参考hasnext()和hasnextLine()、NextLine().split(“某字符”)hasnext():当扫描到一个输入时为真;hasNextLine():当扫描到一行时为真;next():输入一个String;NextLine():输入一行,形式为String,与hasnextLine()配合使用;split(""):split("")方法中的参数必须用双引号包住,分割后得到得是String[]。输入描述:输入数据有多组, 每行表示一组输入数据。每行不定有n个整数,原创 2021-03-30 20:23:30 · 462 阅读 · 0 评论 -
二叉搜索树--JZ26、面试题54、68
JZ26 二叉搜索树与双向链表(该题采用LeetCode上的形式)面试题54 二叉搜索树的第k大节点题目:给定一棵二叉搜索树,请找出其中第k大的节点。题解:看到二叉搜索树,就应想到二叉搜索树的中序遍历为 递增序列。则,二叉搜索树的 中序遍历倒序 为 递减序列 ;因此,求 “二叉搜索树第 k大的节点” 可转化为求 “此树的中序遍历倒序的第 k个节点”。# 打印中序遍历// 中序遍历模板void dfs(TreeNode* root) { if(root == null) retu原创 2021-01-29 13:06:33 · 111 阅读 · 0 评论 -
哈希表--面试题50-I、-II
面试题50-I 第一个只出现一次的字符在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。示例:s = "abaccdeff"返回 "b"s = "" 返回 " "题解:模式识别:涉及次数要考虑用哈希表,一般字符为key,下标为值(或依据题意为其它)。具体步骤:代码:class Solution {public: char firstUniqChar(string s) { map<char,int> hashmap;原创 2021-01-25 13:40:48 · 356 阅读 · 0 评论 -
滑动窗口+队列--面试题48、57-I、-II、59-I、-II
面试题48 最长不含重复字符的子字符串参考 LeetCode3 无重复字符的最长子串原创 2021-01-21 13:19:29 · 315 阅读 · 0 评论 -
数字规律问题--面试题43、44、45、62
题目:输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。方法一、找规律题解:参考注:1、位因子应是: 10**i-1;2、其中每次易得1出现的次数,可以这样理解易得:想到生活中常见的密码锁,就是那种几个滚轮的密码锁,固定其中的一位密码(即,当前位),拨动其他位置的密码。这样就可以理解图中给出的 “易得”了……代码:class Solution {public: int N原创 2021-01-11 13:26:37 · 1741 阅读 · 0 评论 -
排序--JZ29、63、32、面试题51、61
文章目录JZ29 最小的k个数JZ29 最小的k个数题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。示例1输入[4,5,1,6,2,7,3,8],4返回值[1,2,3,4]题解:方法一:排序直接排序,然后取前k小数据。class Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> inpu原创 2021-01-06 18:01:16 · 328 阅读 · 0 评论 -
字符串--JZ27、面试题5、58 - I、- II、67
JZ27 字符串的排列题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9`(可能有字符重复)`,字符只包括大小写字母。示例1输入"ab"返回值["ab","ba"]注:字典序 含义:找本英汉字典,和那个排序方法一样。对于字符串,先按首字符排序,如果首字符相同,再按第二个字符排序,以此类推。如aa,ab,b原创 2021-01-04 16:27:22 · 190 阅读 · 0 评论 -
栈 JZ5、20、21
JZ20包含min函数的栈题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。在该栈中调用min、push及pop的时间复杂度都是O(1)。题解:由于返回最小值,需要遍历整个栈,时间复杂度为O(n),所以这里自然想到空间换时间(这里为辅助栈)的思想。首先需要一个正常栈normal,用于栈的正常操作,然后需要一个辅助栈minval,专门用于获取最小值,具体操作如下。代码:class Solution {public: stac原创 2020-12-18 21:13:26 · 153 阅读 · 2 评论 -
树 JZ17、18、58、23、24、26、57、61、面试题7、32 - I、Ⅱ、Ⅲ、55- I、Ⅱ、68- I、Ⅱ
文章目录JZ17 树的子结构知识点:JZ17 树的子结构题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)示例1输入{8,8,#,9,#,2,#,5},{8,9,#,2}返回值true题解第一步,在树A中找到和树B的根节点的值一样的节点R;这实际上是对树的遍历树的遍历有递归和循环两种方法,下面是递归方法(以前序遍历为例)void preOrderTraverse(T){ /不管前中后序,下面两句都在最前面最后递归结束条件 i原创 2020-12-16 22:09:51 · 513 阅读 · 0 评论 -
JZ52、16、27---递归
JZ52正则表达式匹配题目描述请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配示例1输入"aaa","a*a"返回值true注:1、'*'表示它前面的字符可以出现任意次(包含0次):说明'*'前面要有字符,即模式的第一个字符不可能是'*',最原创 2020-12-09 12:02:44 · 168 阅读 · 0 评论 -
面试题17------大数问题
面试题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 为正整数题解:大数越界问题: 当 n较大时,end=10^n - 1会超出 int32 整型的取值范围,超出取值范围的数字无法正常存储。但由于本题要求返回 int 类型数组(如下第一个代码,返回ve原创 2020-12-03 21:59:10 · 328 阅读 · 0 评论 -
动态规划-----JZ67,JZ52、面试题46、47、48、49、60、63
JZ67剪绳子题目描述给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。输入描述:输入一个数n,意义见题面。(2 <= n <= 60)返回值描述:输出答案。示例1输入8返回值18预备知识动态规划(Dynamic progr原创 2020-12-02 18:27:27 · 570 阅读 · 0 评论 -
回溯、DFS---JZ65、JZ66、24、27
JZ65矩阵中的路径参考这里知识点:DFS模板:dfs(){ // 第一步,检查下标是否满足条件 // 第二步:检查是否被访问过,或者是否满足当前匹配条件 // 第三步:检查是否满足返回结果条件 // 第四步:都没有返回,说明应该进行下一步递归 // 标记 dfs(下一次) // 回溯} main() { for (对所有可能情况) { dfs() }}代码class Solu原创 2020-11-30 15:27:54 · 262 阅读 · 0 评论 -
二分查找--JZ6、面试题53
旋转数组的最小数题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。示例1输入[3,4,5,1,2]返回值1注:1、非递减排序:这里有些歧义,暂且当做递增排序来处理。2、这里定义的旋转:比如说{3,4,5,1,2}是{1,2,3,4,5}的一个旋转,旋转后第一个元素大于等于最后一个元素。3、最开始的若干个元素:若干个可以是0个,若是0个,则原创 2020-11-29 13:07:14 · 176 阅读 · 0 评论 -
链表系列--JZ3、14、56、55、15、16、25、面试题6、18、52、62
JZ14链表中倒数第k个结点题目描述输入一个链表,输出该链表中倒数第k个结点。示例1输入1,{1,2,3,4,5}返回值{5}注:1、链表结构含有头结点。2、参考这里方法一:普通解法题解:求倒数第k个,可以转换成求正数第多少个。特例:1、k<=0 或者头结点最开始就为空,也就是没有节点2、节点的总个数 < Kclass Solution {public: ListNode* FindKthToTail(ListNode* pListHead, unsi原创 2020-11-27 21:43:20 · 802 阅读 · 0 评论 -
JZ13、19、28数组系列、面试题3、4、66
JZ13调整数组顺序使奇数位于偶数前面题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。题解函数的类型为void func_name(array&),返回void,想让我们不开辟额外数组来解决,使用in-place就地算法。方法一:使用辅助数组但是如果空间要求不高的话,我们还是可以开辟个额外数组,接下来的做法就非常简单了,遍历一次数组,遇到奇数直接放入新开的数组中原创 2020-11-25 21:32:20 · 372 阅读 · 0 评论 -
JZ7--JZ10斐波那契数列及其变体
JZ7斐波那契数列题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39示例1输入4返回值3方法一:递归(从上向下计算)题目分析,斐波那契数列公式为:f[n] = f[n-1] + f[n-2], 初始值f[0]=0, f[1]=1,目标求f[n]看到公式很亲切,代码秒秒钟写完。int Fibonacci(int n) { if (n==0 || n==1) return n; ret原创 2020-11-25 11:09:05 · 732 阅读 · 0 评论 -
位运算(整数的二进制处理方法)JZ11、12、面试题56-I、64、65
JZ11二进制中1的个数题目描述输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。示例1输入10返回值2方法一:暴力方法分析:题目给一个有符号的整数int,求整数转化成二进制数后,1的个数。直接根据题目的描述来提出方法一。有2个问题:问题1: 如何从十进制数转化到二进制数?问题2:转化为二进制数后,如果判断有1的个数?方法1:除2取模法。int val; // input dataint count = 0;while (val != 0) {原创 2020-11-24 21:49:40 · 631 阅读 · 0 评论