![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer学习笔记
夜舟酥雨
这个作者很懒,什么都没留下…
展开
-
剑指offer学习笔记——位运算1:统计二进制中的1的个数
二进制相对于十进制来说总是比较抽象的。例题:对于给定一个整数,要求统计整数中的二进制个数。这个题有一个常规的思路就是我们统计这个整数最后一位是不是1,然后再将其右移移位。但是由此出现了一个严重的问题,如果是负数的话,右移之后前面时补1的,而不是补0。所以除非实现规定好右移多少次(4个字节 32次),否则,如果整数是否变为0来作为循环判断的话是会陷入死循环。以此为启发,我们不移动整数了。以此判断从末...原创 2018-06-11 11:04:14 · 545 阅读 · 0 评论 -
剑指offer学习笔记——面试题28:字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba(输入时可能有字符重复)解题思路:方法一:使用C++STL的全排列函数next_permutation()以及prev_permutation()。next_permutation()的作用是找到下一个排列(比当前排列大...原创 2018-06-27 17:12:25 · 200 阅读 · 0 评论 -
剑指offer学习笔记——面试题32:整数中1出现的次数(从1到n整数中1出现的次数)
题目描述:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。解题思路:解法一:不考虑时间效率的解法(略)ps:我感觉是个程序员都能想到这第一种解法,时间复杂度O(nlo...转载 2018-07-02 19:13:33 · 242 阅读 · 0 评论 -
剑指offer学习笔记——面试题26:复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)struct RandomListNode { int label; struct RandomListNode *next, *random; Rand...原创 2018-06-27 13:57:44 · 205 阅读 · 0 评论 -
剑指offer学习笔记——面试题30:最小的K个数
题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解题思路:方法一:直接排序O(NlogN)看到这到题第一时间的思路是进行排序,排序之后可以快速找到这几个数字。但是排序的时间效率只有O(NlogN)速度较慢 vector<int> GetLeastNumbers_Solution(vector<...原创 2018-07-02 16:00:06 · 230 阅读 · 0 评论 -
剑指offer学习笔记——面试题29:数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路:看到这到题第一时间有两个思路,第一个思路是进行排序,那么如果一定存在这样的一个数的话,最中间的数即为所求!但是排序的复杂度为O(nlogn),有点慢。第二个思路就是对元素计...原创 2018-06-30 20:43:11 · 216 阅读 · 0 评论 -
剑指offer学习笔记——面试题27:二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL),...原创 2018-06-29 16:32:53 · 263 阅读 · 0 评论 -
剑指offer学习笔记——排序1:整体总结与C++实现
排序算法是必须要掌握的基础知识,针对于各种排序算法,下面是基础的C++实现: 排序方法 平均情况 最好情况 最坏情况 辅助空间 稳定性 冒泡排序 O(n^2) O(n) O(n^2) O(1) 稳定 简单选择排序(键值交换为O(n)) O(n^2) O(n^2) O(n^2) O(1) 不稳定...原创 2018-06-10 16:47:16 · 210 阅读 · 0 评论 -
剑指offer学习笔记——链表1:链表的定义,删除和尾后插入
剑指offer第二章:面试基础知识之链表1.单向链表结点定义: struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};2.注意,下面的实现函数中,有两种类型: 1)函数有返...原创 2018-06-07 15:31:11 · 249 阅读 · 0 评论 -
剑指offer学习笔记——面试题20:包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数,以及push,pop函数。要求三个函数的时间复杂度均为O(1)。解题思路:1.只设置一个变量保留最小的值是没有意义的,所以我自己一开始想到的是用Map:class Solution {public: vector<int> stack; map<int,int> dict; ...原创 2018-06-16 16:32:43 · 200 阅读 · 0 评论 -
剑指offer学笔记——二叉树1:二叉树的递归与非递归遍历
二叉树的递归遍历比较简单,如果要求非递归遍历,那么我们可以考虑使用栈来模拟递归调用,具体见代码:class Tree{ public: int val; Tree *left = NULL, *right = NULL;}vector<int> pre,in,post;//前序遍历void pre_trans_recursion(Tree* root){...原创 2018-06-08 21:20:17 · 185 阅读 · 0 评论 -
剑指offer学习笔记——面试题20:顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.解题思路:打印一圈可以分为4步:1)从左到右打印 2)从上到下打印 3)从右到左打印 4)从下到上打印我们可以控制每一圈的四个顶点处...原创 2018-06-15 11:05:34 · 180 阅读 · 0 评论 -
剑指offer学习笔记——链表2:单链表的翻转(非递归&递归)
对应于剑指offer代码鲁棒性面试题16——反转链表:题目:输入一个链表,反转链表后,输出反转之后链表的头结点。求解思路:有非递归与递归两种解法:1、如果用非递归,为了防止反转一个结点之后链表断掉,我们必须记录当前结点cur,当前结点之前的节点pre,以及当前结点之后的节点post。2、如果使用递归,我们就假设当前结点之后的都已经反转好了。仅仅需要将当前结点之后的结点(post)连到当前结点,当前...原创 2018-06-13 16:32:14 · 299 阅读 · 0 评论 -
剑指offer学习笔记——面试题36:数组中的逆序对
题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007例如{7,5,6,4},一共有5个逆序对:{7,6},{7,5},{7,4},{6,4},{5,4}解题思路:第一种思路:最简单的想法是就行n2的遍历,但是这种方法效率太低。第二种思路:使...原创 2018-07-04 20:53:10 · 352 阅读 · 0 评论