剑指offer
早起的鸟儿有食吃
无名之辈W
不忘初心,方得始终
展开
-
剑指 Offer 50——第一个只出现一次的字符
题目描述:剑指 Offer 50. 第一个只出现一次的字符在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。示例:s = “abaccdeff”返回 “b”s = “”返回 " "限制:0 <= s 的长度 <= 50000分析:思路就是新建一个数组作为哈希数组,去存储所给字符串中每个字符出现的次数,键值key存储字符,值value存储该字符出现的次数。在这里字符(char)占了1个字节,长度为8,即1(byte) = 8(..原创 2020-09-07 15:30:22 · 163 阅读 · 0 评论 -
剑指offer——面试题41:数据流中的中位数 + make_heap()、push_heap()、pop_heap()的用法
题目描述:分析:代码:原创 2020-08-21 23:52:01 · 252 阅读 · 0 评论 -
剑指38 & 牛客——字符串的排列
文章目录面试题38:字符串的排列分析:1. 用递归思路实现全排列:递归C代码:2. 用DFS(深度优先搜索)实现全排列:DFS实现代码:DFS(AC):待解答~3. 利用C++中STL提供的next_permutation函数(AC)使用next_permutation的函数代码:总结:面试题38:字符串的排列输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s = “abc”输出:[“abc”,“acb”,“bac”,“bca原创 2020-08-14 16:18:54 · 95 阅读 · 0 评论 -
剑指offer——面试题26:树的子结构
题目描述(from nowcoder):输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)分析:树1是原树,树2是要被匹配的树。思路总体分为两部分,第三部分是对特殊情况的处理:遍历树1找与树2根值相同的节点,找打了之后就继续判断其结构是否相匹配;如果不匹配,则返回到开始判断的节点,继续遍历树1的左子树与右子树重复步骤1的做法,直到树2被遍历完成之后都和树1的某一部分匹配为止返回true,否则返回false。整体实现思路完成之后,考虑特殊情况..原创 2020-08-06 11:48:59 · 85 阅读 · 0 评论 -
键指offer——面试题24:反转链表、面试题25:合并两个排序的链表
面试题24:反转链表输入一个链表,反转链表后,输出新链表的表头。分析从院链表的头结点开始反转,先将头结点指向空指针,然后依次反转原链表中的节点,直到遍历到原链表的最后一个节点的下一个节点nullptr处,将其赋值为结果链表的头结点即结束。核心: 先让next移动next = node->next;,然后再反转node->next = pro;画图最好理解了,根据这个流程可以写出整体的框架,然后就是注意空链表与链表中只有一个元素的特殊情况处理即可。代码/** * Definitio原创 2020-08-04 15:50:19 · 88 阅读 · 0 评论 -
剑指offer——面试题22:返回链表中倒数第k个节点、求链表的中间节点
题目描述1:返回链表中倒数第k个节点输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。思路双指针即快慢指针方法。考虑特殊情况:1. 链表为空 2. k=0 3. k<链表长度。代码/** * Definition for singly-linked list. * struct ListNode { *原创 2020-08-04 10:09:38 · 252 阅读 · 0 评论 -
剑指offer——面试题21:调整数组顺序使奇数位于偶数前面、考察代码的可重用性、vector元素的访问方法:迭代器/下标法
文章目录面试题21:调整数组顺序使奇数位于偶数前面题目描述1:[from leecode]考察代码的可重用性题目描述2:[from牛客网]笔记1. 定义vector方法2. 遍历访问vector的方法面试题21:调整数组顺序使奇数位于偶数前面题目描述1:[from leecode]输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。示例:输入:nums = [1,2,3,4]输出:[1,3,2,4]注:[3,1,2,4] 也是正确原创 2020-08-01 09:56:15 · 102 阅读 · 0 评论 -
剑指offer——面试题19:正则表达式匹配、面试题20:表示数值的字符串
面试题19:正则表达式匹配题目描述:请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配。分析怎么说呢,对于当模式中字符的下一个为‘*’还是有点不理解,为什么会有三种情况出现,现大致举了三个例子来匹配三种情况,总之就是因为“*”可以匹配任意次(包括0)次的*之前的字符原创 2020-07-29 22:29:01 · 168 阅读 · 0 评论 -
剑指offer——面试题18:删除链表的节点
文章目录题目描述题目一:在O(1)时间内删除链表节点题目描述题目一:在O(1)时间内删除链表节点题目描述:在O(1)时间内删除链表节点。给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。链表节点定义如下://链表节点定义struct ListNode{ int Value; ListNode* Next;}void DeleteNode(ListNode** pListHead, ListNode*pToBeDeleted);思路分析:首先删除链表中原创 2020-07-16 11:57:57 · 172 阅读 · 0 评论 -
剑指offer——面试题17:打印从1到最大的n位数
题目描述剑指的剑终于打对了~题目描述: 输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。分析(以n=3为例)没有递归之前的思路是一个位一个位的放值,先放第0位,也就是百位数,然后是十位,最后是个位。每一个百位值都对应有9个十位的值,对应有9*9个个位的值。这个图是自己理思路时写的代码,仅供参考。其实这个代码更好理解一些: //第0位的数值设置 for(int i=0;i<10;i++) { number[0] = i+'原创 2020-07-04 17:38:02 · 309 阅读 · 0 评论 -
键指offer——面试题15:二进制中1的个数(p99-103)
题目描述请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例:9的二进制表示为1001,有2位是1。经典解法分析:让一个flag = 1,然后与n相与,相与结果为1的话就证明最后一个位置为1;然后让flag不断左移,与n相与,最终用count变量统计到原数n中1的个数。经典解法代码://求二进制中1的个数#include<iostream>using namespace std;int main(){ //经典解法 int n = 10; int fla原创 2020-06-28 16:57:32 · 1178 阅读 · 0 评论 -
键指offer——面试题7:重建二叉树(p60-64)
二叉树这里给我快看瞌睡了,大家还是要保护好眼睛呐~面试题7:重建二叉树题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。分析:解决方法就是将大的问题转化成一个个小的问题解决,根据前序遍历找到这个根节点,然后就可以在中序遍历里找到这个根节点,然后将其分为左子树与右子树,再将左子树与右子树分别看成一个二叉树去原创 2020-06-05 16:11:54 · 136 阅读 · 0 评论 -
键指offer——面试题6:从尾到头打印链表+链表知识复习
周一原创 2020-06-01 22:04:53 · 141 阅读 · 0 评论 -
键指offer——动态规划与贪婪算法+面试题14:剪绳子(p94-p98)
动态规划(dp,Dynamic Programming)如果编程题是求一个问题的最优解(通常是最大值或最小值),而且该 问题能够分解为若干个子问题,并且子问题之间还有重叠的更小的子问题,就可以考虑用动态规划来解决。动态规划求解的问题的四大特点:求一个问题的最优解;整体问题的最优解是依赖各个子问题的最优解;大问题可以分成若干个子问题,这些子问题之间还有相互重叠的更小的子问题;从上往下分析问题,从下往上求解问题。由于子问题在分解大问题的过程中重复出现,为了避免重复求解子问题,可以从下往上的顺序原创 2020-05-30 11:19:40 · 355 阅读 · 0 评论 -
键指offer——面试题11:旋转数组的最小数字(p79-p87)
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。分析:二分查找法:让两个指针分别指向数组的第一个元素和最后一个元素。按照题目中的规则就是第一个元素应该是大于或等于最后一个元素的。我们以数组{3, 4, 5, 1, 2}为例。首尾指针的移动过程如图所示,不断循环,直到最终两个指针的距离为1时,表明第一个指针已经指向第一个递增原创 2020-05-25 21:17:36 · 149 阅读 · 0 评论 -
键指offer——面试题5:字符串之替换空格(p49-54)
替换空格题目描述:实现一个函数,将字符串中的每个空格替换成"%20"。例如:输入“We are happy.”,则输出"We%20are%20happy."。分析:我们这题就先假设所给的字符串长度够长,足以用来将全部空格替换成"%20",不然的话替换的时候就会覆盖原有的字符串喽。以string = “We are happy.”为例子,如图所示:原始string空格处插入"%20"之后就变成了新的字符串newString。在操作的时候我们先计算出原始string的长度为14(包括结尾处的'\0原创 2020-05-21 14:16:32 · 115 阅读 · 0 评论 -
键指offer——面试题4:二维数组中的查找(p44-48)
二维数组的查找题目描述:在一个二维数组中,每行都按从左到右的方向递增排序,每列按从上到下的方式递增排序。完成一个函数,输入一个要查找的数num和这个二维数组,判断这个二维数组中是否有这个值。分析:办法就是现在这个二维数组中找到一个值,和num比较大小:相同,则return True;否则不相同 :num大于这个值的话一定是在这个数的右方和下方区域,num小于这个值的话一定是在这个数的左下方区域。相对简单的就是把二维数组中的这个要和num进行比较的数放在右上角或者左下角区域。放右上角:这样若num原创 2020-05-21 09:12:47 · 253 阅读 · 0 评论 -
键指offer——面试题3:数组中重复的数字(p37-43)
面试题3:数组中重复的数字题目一:找出数组中重复的数字题目:在一个长度为n的数组里的所有数字都在0~n-1范围内。数组中某些数字是重复的,请找出数组中任意一个重复的数字。例如:输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复数字2或者3。注意仔细读题,尤其是这些信息: 长度为n;数字范围是0~n-1(因此也一定是有重复数字的);找出任意一个。动手写代码之前,问清楚面试官的需求,是求任意一个重复字符还是求出全部的重复字符。分析:可以用哈希表:从头到尾扫描数字,每扫描到一个原创 2020-05-15 18:25:09 · 245 阅读 · 0 评论 -
键指offer——面试题1:赋值运算符函数(p25)
面试题1:赋值运算符函数题目: 如下类型CMyString的声明,请为该类型添加赋值运算符函数class CMyString{//内部成员函数public: CMyString(char* pData = nullptr);//构造函数,对象 CMyString(const CMyString& str); ~CMyString(void);private: char*...原创 2020-05-08 16:59:11 · 168 阅读 · 0 评论 -
键指offer——求链表中的倒数第k个节点(p13)
求链表中的倒数第k个节点思路: 用两个指针,第一个指针先走k-1步,然后两个指针一起走。当第一个指针走到尾节点时,第二个指针指向的就是倒数第k个节点。如图所示:笔记:链表的概念:由一系列不必在内存中相连的结构组成的,通过指针将一个个两三的内存块链接起来的线性的数据结构。链表的每个内存块称为结点Node;每一个结构均含有表元素和指向包含该元素后继元的结构的指针,称为Next指针;最后一个单...原创 2020-05-06 11:06:12 · 111 阅读 · 0 评论 -
键指offer——C++语言(p12-p24)
微软技术面试常问题——将一个字符串转换成整数主要功能实现:int StrToInt(char* string){ int number=0; while(*string!=0) { number = number*10 + *string - '0'; ++string; } return number;}注意:在实现功能的同时考虑:边界条件、特殊输入(如nullpt...原创 2020-05-05 22:13:48 · 173 阅读 · 0 评论