剑指offer
FiveWords
努力变强!
展开
-
剑指offer 滑动窗口的最大值
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5...原创 2020-02-08 13:28:43 · 45 阅读 · 0 评论 -
剑指offer 数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。题目分析对于一个实时的数据流,我们要获取其中位数就要维护两个堆:大顶堆与小顶堆保证大顶堆与小顶堆中数...原创 2020-02-08 13:28:49 · 58 阅读 · 0 评论 -
剑指offer 不适用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。题目分析遇到这种题目,首先想到使用位运算,既然使用二进制位运算,那么怎么才能实现加法呢?求进位位,(num1&num1)<<1求非进位位,num1^num2直到进位位为0,那么非进位位即为所求java代码public int Add(int num1,int num2) {...原创 2020-02-08 13:28:39 · 83 阅读 · 0 评论 -
剑指offer 圆圈中最后剩下的数字
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一...原创 2020-02-08 12:38:28 · 113 阅读 · 0 评论 -
剑指offer 数字在排序数组中出现的次数
题目描述统计一个数字在排序数组中出现的次数。题目分析使用两次折半查找,第一次找第一个k,第二次找最后一个kJava代码public int GetNumberOfK(int [] array , int k) { int start = 0; int end = array.length - 1; int first = GetFirstK...原创 2020-02-07 22:11:26 · 52 阅读 · 0 评论 -
剑指offer 数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007题目分析使用分治的策略解决这个问题分:计算每一个子问题中的逆序对,并进行排序(方便计算和数组的逆序对)和:根据排好序的数组,计算逆序对,使用前后两个指针java代码// 采用分...原创 2020-02-07 22:11:32 · 50 阅读 · 0 评论 -
剑指offer 数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。题目分析这种题目一般使用位运算来计算。显然这个题目与使用异或运算寻找一个单独数字有异曲同工之妙,只不过这次取异或之后,我们得到的是一个分组标志flag,num&flag=1一组,num&flag=0一组,两组各包含一个单独数字。java代码public void Find...原创 2020-02-07 22:10:49 · 60 阅读 · 0 评论 -
剑指offer 第一次只出现一次的字符
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).题目分析两次扫描,第一次建立哈希表(key:字符——value:次数),第二次寻找出现一次的字符java代码public int FirstNotRepeatingChar(String str) { i...原创 2020-02-07 17:14:37 · 57 阅读 · 0 评论 -
剑指offer 丑数
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。题目分析这个题目其实是素数筛的变种问题,只要按顺序拿出所有的丑数就可以了。java代码public int GetUglyNumber_Solution(int index) { if...原创 2020-02-05 20:48:15 · 91 阅读 · 0 评论 -
剑指offer 连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列...原创 2020-02-05 20:30:00 · 100 阅读 · 0 评论 -
剑指offer 数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。题目分析如果有一个数字在数组中出现次数大于数组的一半,那么也就是说他出现的次数比其他数字出现次数和还要多。我们可以设置两个变量,一个保存数组中的一个数字,另外一个保存次数,遍历...原创 2020-02-05 19:36:59 · 47 阅读 · 0 评论 -
剑指offer 字符串排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。题目分析要打印所有的字符串排列,其实是将字符串中的每一个字母与后面的字母进行交换所有中间节点的值。我们可以从递归的角度进行考虑,他其实是函数F,F的作用是将字符串的首字母与后面的每一个字符交换,如果后面没有字母,...原创 2020-02-05 19:36:16 · 93 阅读 · 0 评论 -
剑指offer 包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。题目分析使用一个辅助栈,每次主栈压入最小值时,将此最小值压入辅助栈即可java代码import java.util.Stack;public class Solution { Stack<Integer> S = new Stack<In...原创 2020-02-03 18:32:56 · 78 阅读 · 0 评论 -
剑指offer 树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)题目分析在比较树的子结构时,我们可以进行如下考虑:如果B树为A树的子结构,那么,A的某个结构T的根节点与B的根节点相同,并且T的左子树等于B的左子树,T的右子树等于B的右子树其余情况则B不为A的子结构根据以上情况我们可以使用递归的方式,比较A的所有结构的根节点与B的根节点,进行子结构比较...原创 2020-02-03 18:23:27 · 133 阅读 · 0 评论 -
剑指offer 反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。题目分析该题目有两种解题思路,递归方式与非递归方式,直接给出代码,在代码中给出重要问题及其解释java代码(非递归)static class ListNode { int val; ListNode next = null; ListNode(int val) { ...原创 2020-02-03 18:09:02 · 57 阅读 · 0 评论 -
剑指offer 链表中倒数第K个节点
题目描述输入一个链表,输出该链表中倒数第k个结点。题目分析首先想到的是,遍历一遍链表,得到链表长度n,那么正数n-k+1即为所求,但是这时候需要遍历两遍链表,那么有没有遍历一边链表的方式吗?答案是,有的.我们可以使用双指针来解决这个问题,保证指针之间的距离为k,前指针到链表尾null时,后指针正好为第n-k+1个节点java代码public class ListNode { ...原创 2020-02-01 22:49:52 · 85 阅读 · 0 评论 -
剑指offer 数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0题目分析这道题目其实不难,但是要仔细计算,主要有指数为0,负数与正数三种情况,0时,只要base!=0,result=1正数时,可以使用指数的快速幂计算,公式如下:an={an/2∗an/2,if n ...原创 2020-02-01 21:59:35 · 54 阅读 · 0 评论 -
剑指offer 二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。题目分析使用二进制位运算,分析末尾为1与0两种情况,即可得出以下代码:java代码public static int NumberOf1(int n) { int count = 0; while(n!=0){ count++; n = ...原创 2020-02-01 15:57:33 · 73 阅读 · 0 评论 -
剑指offer 二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。题目分析分析1看到这个题目,我们首先的反应是折半查找,因为这是一个有序数组,那么可以在每一个分量上面进行折半查找,那么这样的时间复杂度为O(nlogn).分析2在上面的分析上面,显然...原创 2020-02-01 14:51:50 · 110 阅读 · 0 评论 -
剑指offer旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。题目分析分析1首先我们可以很简单的想到,遍历一遍,O(n)的时间复杂度,但是显然,这应该是不是这道题目想...原创 2020-02-01 14:49:59 · 71 阅读 · 1 评论