剑指offer
这里主要介绍 剑指offer 里面的部分相关题目实现的思路已经代码实现,希望可以帮到你。
码莎拉蒂 .
这个作者很懒,什么都没留下…
展开
-
剑指offer之归并排序
1 问题是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法2 分析过程 1 4 3 2 6 8 7 5 ...原创 2019-10-26 02:38:39 · 2275 阅读 · 0 评论 -
剑指offer之求数组里面只出现一次的的两个数据
1 问题一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。2 分析第一种方法:我们用位运算我们想到位运算(1) a^a=0(2)a^0=a(2)a^b^c=a^(b^c)=(a^c)^b1) 对所有运算进行异或运算,最后结果就是两个出现一次的元素异或结果,接下来问题演变成了我们知道两个不...原创 2019-10-24 02:59:30 · 2158 阅读 · 0 评论 -
剑指offer之二进制中1的个数
1 问题实现一个函数,输入一个函数,输出该二进制数据中1的个数。例如9表示二进制数据1001,有2位是1,因此输入9,该函数会输出2。2 分析我们先了解下计算机里面位运算,有5种1)& 这个是与操作,规律如下1 & 1 = 1 1 & 0 = 0 0 & 1= 0 0 & 0 = 0...原创 2019-10-22 01:15:23 · 2126 阅读 · 0 评论 -
剑指offer之调整数组顺序使奇数位于偶数前面
1 问题输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分,比如数组{6、5 、1、4、2 、7 、3、8、9}我们调整后变成这样{9、5、1、3、7 、2 、4 、8、6} 2 分析我们利用partition算法博客可以知道,这里还是利用两个指针,一个指针指向开始,一个指针指向尾巴,分别从两边进...原创 2019-10-20 21:25:28 · 2134 阅读 · 2 评论 -
剑指offer之最小的K个数
1 问题输入N个整数,找出其中最小的K个,例如输入数组6、5、1、4、 2、 7、 3、 8,最小的4个数是1、2、3、42 分析1)我们可以用快速排序从小到大,但是时间复杂度是O(nlogn) 我们取出最前面的K个数就行。2)用partition算法,时间复杂度是O(n)我之前的博客讲解partition算法的总结如下:我们使用partition算法的时...原创 2019-10-20 02:04:06 · 2129 阅读 · 0 评论 -
剑指offer之快速排序
1 快速排序通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列2 分析思路很明显,先是用到了partition算法思想(前面的博客提到了),然后再把原始数据分成几部分然后递归同样用partition算法处理...原创 2019-10-19 02:39:46 · 2194 阅读 · 0 评论 -
剑指offer之partition算法
1 问题partition 算法:从无序数组中选出枢轴点 pivot,然后通过一趟扫描,以 pivot 为分界线将数组中其他元素分为两部分,使得左边部分的数小于等于枢轴,右边部分的数大于等于枢轴(左部分或者右部分都可能为空),最后返回枢轴在新的数组中的位置。如果原始数组为[5,9,2,1,4,7,5,8,3,6],那么整个处理的过程如下图Partition 可不只用在快速排序...原创 2019-10-18 01:42:59 · 2816 阅读 · 0 评论 -
剑指offer之数组出现次数超过一半的数字
1 问题数组中有一个数字出现了次数超过数组长度的一半,请找出这个数字。比如{1,2,3,2,2,2,5,4,2},我们知道这个数是22 分析我们数组元素个数分为单数和双数1)数组长度是单数的情况下我们有5个元素,里面至少3个2,还有2个元素我们可能重复也可能不重复我们可以定义一个计数为1,先用变量保存数组第一个数据,然后遍历数组,如果发现后面的数...原创 2019-10-17 00:40:27 · 2101 阅读 · 0 评论 -
剑指offer之重建二叉树
1 问题重建二叉树:给定二叉树的先序遍历(根左右)和中序(左中右)遍历结果,建立这棵二叉树。输入保证二叉树无重复结点以先序{1, 2, 4, 7, 3, 5, 6, 8}和中序{4, 7, 2, 1, 5, 3, 8, 6}为例2 分析先序遍历的特点,我们知道{1, 2, 4, 7, 3, 5, 6, 8}第一个元素1就是树的根节点,然后中序遍历{4,...原创 2019-10-15 01:09:55 · 2070 阅读 · 0 评论 -
剑指offer之求二叉树中两个节点的最低共同父节点
1 问题求二叉树中俩个节点的最低共同父节点,比如二叉树如下 4 2 6 1 3 5 7 比如节点1和3两个节点的最低共同父节点是2,节点3和5两个节点的最低共同父节点是4,节点5和6两个节点的最低共同父节点是6, 也有可能其中1个节点或者2个节点不在二叉树里面,那么他们就...原创 2019-10-12 23:58:18 · 2323 阅读 · 0 评论 -
剑指offer之二叉树的下一个结点
1 问题给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针2 分析比如我现在的二叉树如下 4 2 6 1 3 5 7 这里分3种情况1) 如果这个节点包含右子树,...原创 2019-10-11 23:45:19 · 2128 阅读 · 0 评论 -
剑指offer之股票的最大利润
1 问题求股票的最大利润,简言之就是求一个数组里面元素差的最大值,要求时间复杂度O(n)2 代码实现#include <stdio.h>#include <stdlib.h>int maxDiff(int *number, int length){ if (NULL == number || length < 2) { ...原创 2019-07-30 23:40:14 · 2305 阅读 · 0 评论 -
剑指offer之滑动窗口的最大值
1 问题给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值,列如,数组{2,3,4,2,6,2,5,1}的滑动窗口大小是3,一起6个滑动窗口,分别是{4,4,6,6,5}2 分析2,3,4,2,6,2,5,1我们这里可以用双端队列,滑动窗口是3,我们先找出前3个数字里面的最大值,放在双端队列的头,然后依次向右滑动,确保每次滑动后队列的头是最大值。...原创 2019-08-03 15:28:51 · 2131 阅读 · 0 评论 -
剑指offer之圆圈最后剩下的数
1 问题求圆圈最后剩下的数,比如数组0, 1, 2 ,3 ,4围城一个环,我们每次去掉第三个数字,删除的前4个数字依次是2, 0, 4, 1,最后剩下的数字是3 0 4 1 3 22 思路我们用list,我们要支持环就这样,...原创 2019-08-01 00:28:16 · 2234 阅读 · 2 评论 -
剑指offer之翻转单词顺序
1题目输入一个英文橘子,翻转句子中的单词顺序,但是单词内字符串的顺序不变,简单起见,标点符号和普通字符字母一样处理,例如输入字符串"I am a student.",则输出"student. a am I"2思路先反转字符串所有,然后在反转里面的单词,我们用两个首尾指针操作3代码实现#include <stdio...原创 2019-08-06 12:12:45 · 2280 阅读 · 0 评论 -
剑指offer之左旋转字符串
1 题目字符串的左旋转操作是把字符串前面的若干字符转移到字符串尾部,比如字符串abcdef和数字2,函数返回左旋转得到的结果是cdefgab2 思路先反转字符串所有,通过数字n找到的边界 ,然后再反转字符串部分左边和部分右边。3 代码实现#include <stdio.h>/* * 反转整个字符串 */vo...原创 2019-08-06 22:41:25 · 2078 阅读 · 0 评论 -
剑指offer之和为s的数组
1 问题输入一个递增排序数组和数字和s,在数组里面找2个数,他们的和是s,如果有多对,只需要输出一对。比如数组{1, 2, 4, 7, 11, 15},我们输出4 ,112 思路我们定义2个首尾指针,先是1+15,大于15,然后我们尾巴指针左移一下,然后就是1+11 小于15,然后首指针右移动一下,2+11,依次类推。3 代码实现#i...原创 2019-08-07 18:14:03 · 2594 阅读 · 0 评论 -
剑指offer之剪绳子问题
1 问题给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n>1并且m>1)每段绳子的长度记为k[0],k[1],…,k[m].请问k[0] * k[1] …k[m]可能的最大乘积是多少?例如,当绳子的长度为8时,我们把它剪成长度分别为2,3,3的三段,此时得到的最大乘积是18.2 分析1) 分析边界值n和m题目说了,要求大于1,所以...原创 2019-09-25 23:24:53 · 2599 阅读 · 0 评论 -
剑指offer之斐波那契数列
1 问题写一个函数,输入n,求斐波那契数列的第n项。斐波那契数列定义如下。f(n) = 0; (n = 0)f(n) = 1;(n = 1)f(n) = f(n - 1) + f(n - 2); (n >= 2);2 分析1) 直接用递归2) 我们用两个变量保持每次需要计算下一个值得前面2个数,从最前面开始迭代。...原创 2019-09-26 22:45:13 · 2112 阅读 · 0 评论 -
剑指offer之青蛙跳台阶问题
1 问题一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,求该青蛙跳上一个n级的台阶总共有多少种跳法?2 分析我们可以定位函数f(n),n为n级别的台阶,f(n)的值是青蛙有多少种跳法,我们知道当n为1的时候,f(1) = 1;当n为2的时候,我们知道可以先跳一级再跳一级,或者直接跳2级,这里就有2种跳法,所以f(2) = 2;当n为3的时候,我们可以这样理解...原创 2019-09-27 23:48:11 · 2152 阅读 · 0 评论 -
剑指offer之两个栈实现队列问题
1 问题两个栈实现队列的插入和获取头部元素的功能2 分析我们定义连个栈stack1,stack2,当队列弹出头部元素的时候,我们知道队列先进后出,我们先把一个元素压到stack1,然后再压一个元素到stack1,然后我们把stack1的top函数得到栈顶值然后pop弹出来,push到stack2里面去,这个时候后面进的元素就在stack2...原创 2019-09-28 23:58:11 · 2088 阅读 · 0 评论 -
剑指offer之两个队列实现栈的问题
1 问题两个队列实现栈的插入和获取头部元素的功能2 分析1)获取头部元素的功能分析:我们有2个队列,我们知道队列的特点的先进先出,而栈的特点是先进后出,比如我们有数据1,2,3,4,我们分别依次压入队列1,队列2目前是空,我们需要有栈的效果,加上队列2也是先进先出的特点,意味着我们队列2里面的数据依次是4,3,2,1入队列2,现在问题转成了...原创 2019-09-29 23:46:39 · 2264 阅读 · 0 评论 -
剑指offer之二叉搜索树的第K个节点
1 问题给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 3 7 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。2 分析二叉树定义:二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树...原创 2019-10-10 01:29:26 · 2195 阅读 · 0 评论 -
剑指offer之二叉搜索树和双向链表
1 问题比如我们搜索二叉树如下,我们需要变成双向链表2 分析我们知道这个变成双向链接的时候是按照树的中序遍历打印的,我们只需要在中序遍历打印的时候操作该节点,我们可以用临时变量保存这个节点,同时我们也需要单独增加一个链表节点变量,我们需要保证这个节点的左边指向是该链表节点,然后该链表节点的右指向是这个节点,然后我们再把这个节点赋值给这个链表节点,...原创 2019-10-11 01:02:34 · 2098 阅读 · 0 评论 -
剑指offer之C语言实现链表(两种方式)
1 问题用C语言实现链表2 代码实现#include <stdio.h>#include <stdlib.h>#define true 0#define false -1typedef struct Node{ int value; struct Node *next;} List;/** *初始化链表 */st...原创 2019-01-17 00:08:43 · 2534 阅读 · 0 评论 -
剑指offer之求两个数之和(不能使用四则运算)
1 题目剑指offer之求两个数之和(不能使用四则运算)2 代码实现#include<stdio.h>int add(int num1, int num2){ int sum1; int carry; do { sum1 = (num1 ^ num2); carry = (num1 & num2) <<...原创 2019-07-29 20:50:11 · 2259 阅读 · 1 评论 -
剑指offer之判断二叉树是不是平衡二叉树
1 问题判断二叉树是不是平衡二叉树平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树2 代码实现int getTreeHeigh(Node *haed){ ...原创 2019-06-13 23:21:01 · 2177 阅读 · 0 评论 -
剑指offer之找到链表里面包含环的入口节点
1问题剑指offer之找到链表里面包含环的入口节点,比如 // node7<-node6 <-node5 // | | //head->node1->node2->node3->node4环的入口节点是node22代码实...原创 2019-02-28 22:33:19 · 2177 阅读 · 0 评论 -
剑指offer之打印链表的倒数第N个节点的值
1问题打印链表的倒数第N个节点的值,(要求能只能便利链表一次)比如链表如下,打印倒数第三个值就是41-> 2-> 3-> 4-> 5-> 62思路既然只要只能遍历一次,我们可以这样思考,比如我们要得到倒数第三个,那么它和尾巴的长度就是3,我们可以这一节距离一直往左边移动,那么移动最左边的话,他们的开始是...原创 2019-02-16 23:31:44 · 2352 阅读 · 0 评论 -
剑指offer之反向打印链表值
1问题反向打印链表值2思考1)我们利用栈的思想,新进后出,把链表的每个元素分别入栈之后再打印栈2)既然上面用到了栈,我们应该就会想到用到递归来实现3代码实现#include <iostream>#include <stack>#include <stdlib.h>using...原创 2019-02-16 20:38:03 · 2289 阅读 · 0 评论 -
剑指offer之把字符串里面空格替换成百分之20[时间复杂度是O(n)]
1 问题把字符串里面空格替换成20%要求:时间复杂度是O(n)2 思路比如我们字符串ab cd ef,我们先计算出新字符串需要的长度,我们分别搞2个指针指向老的和新的字符串的尾巴,然后老字符串从'\0'开始拷贝数据到新的字符串尾巴,同时两个指针同时左移,如果老的字符串遇到了空格,那么老的字符串指针往左边移动一格,然后新的字符串指针依然向左移动并且...原创 2019-02-15 00:05:23 · 2289 阅读 · 0 评论 -
剑指offer之C++语言实现链表(两种删除节点方式)
1问题用C++语言实现链表2代码实现#include <iostream>#include <stdlib.h>using namespace std;class List{public: List(); ~List(); List* createNode(int value);//创建节点 bool i...原创 2019-01-17 00:19:42 · 2386 阅读 · 0 评论 -
剑指offer之求两个链表的第一个公共节点
1 问题输入两个链表,找出它们的第一个公共结点。含有公共节点的两个链表的结构类似于下图中的链表:1 -> 2 -> 3 -> 4 ->5 2 -> 4 ->5可以看到两个链表中有一个公共节点,其中4节点就是这两个链表的公共节点2 分析既然题目是求公共节点,说明一定存在这个节点,然后我们...原创 2019-01-16 03:19:42 · 2216 阅读 · 0 评论 -
剑指offer之用链表实现栈(带头节点)
1 问题用链表实现栈,栈先进后出.2 代码实现#include <stdio.h>#include <stdlib.h>#define true 1#define false 0typedef struct Node{ int value; struct Node *next;} Stack;/*...原创 2019-01-14 02:29:45 · 2301 阅读 · 0 评论 -
剑指offer之把字符串里面空格替换成百分之20
1 问题把字符串里面空格替换成百分之202 代码实现第一种时间复杂的o(n * n)实现#include <stdio.h>#include <stdlib.h>char* insert(char *a, int len, char *replace, int replaceLen){ //先得到多少个空格 char *p ...原创 2019-01-18 18:25:49 · 2248 阅读 · 4 评论 -
剑指offer之不修改数组找出重复的数字
1 题目 不修改数组找出重复的数字在一个长度为N+1的数组里面的所有数字都在范围1~N范围内,所以数组至少有一个数字是重复的,请找出重复数字,但是不能修改输入的数组。 2 思路思路1:我们开辟一个新的数组,初始化为0,然后把原始数组每个数据的值作为下标,把新数组通过这个下标数据取出来,如果取出来是1,就说明这个下标数据重复了,如果不是,我们直接放进去,...原创 2019-01-08 02:02:33 · 2587 阅读 · 0 评论 -
剑指offer之二维数组中查找
1 问题二维数组中查找:在一个二维数组钟,每一行都按照从左到右递增得顺序排列,每一列都按照从上往下得递增排列,请完成一个函数,输入这样得一个二维数组和一个整数,判断数组是否含有该整数列如:1 2 8 92 4 9 124 7 10 136 8 11 152 分析比如我们要找数字7, 我们先从右上角开始分析,...原创 2019-01-17 22:29:13 · 2191 阅读 · 0 评论 -
剑指offer之判断链表是否包含环
1 问题判断链表是否包含环2 思路2个指针,一个指针走一步,一个指针走2步,如果相遇则有,反之无。3 代码实现#include <stdio.h>#include <stdlib.h>#define true 1#define false 0;typedef struct node{ in...原创 2019-02-20 01:15:35 · 2160 阅读 · 0 评论 -
剑指offer之反转链表
1 问题反转链表,比如0->1->2->3反转后变成了3->2->1->02 分析搞3个指针,初始化一个指针,让头结点指向这里,然后另外一个指针初始化为NULL,然后让第一个节点指向这里,然后头结点依次向右移,这个初始化为NULL的指针也向右移动,然后最后当头结点的next指向NULL的时候,我们直接返回这个节点就行了。...原创 2019-05-05 21:49:37 · 2097 阅读 · 0 评论 -
剑指offer之合并已排序链表(递归实现)
1 问题合并2个已经排好序的链接,比如1->3->5->72->4->6合并后新的链表如下1->2->3->4->5->6->72 代码实现#include <stdio.h>typedef struct Node{ int val; ...原创 2019-05-05 22:24:20 · 2143 阅读 · 0 评论