自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

王劭阳的博客

你的指尖,有改变世界的力量!

  • 博客(65)
  • 收藏
  • 关注

原创 蔡勒(Zeller)公式:根据任意日期,计算当天星期几

首先,注明参考地址:https://zhuanlan.zhihu.com/p/79290515蔡勒公式用于根据日期计算那一天是星期几。回想,如果我们已知一个日期,和那个日期是星期几,根据要求日期和已知日期的差值 mod 7就可以得到要求日期星期几了。当然,蔡勒公式也是基于这个想法实现的,只是加入了一些计算方面的化简转换等操作。蔡勒公式的形式:解释:W是星期数;c是4位年份的...

2020-02-27 18:56:11 2240

原创 面试题68:树中两个结点的最低公共祖先

题目:输入两个树结点,求它们的最低公共祖先。分析:分以下几种情况考虑:这棵树是二叉树,并且是二叉搜索树。 不是二叉搜索树,甚至不是二叉树,只是普通的树,有指向父结点的指针。 不是二叉搜索树,甚至不是二叉树,只是普通的树,没有指向父结点的指针。解法:第一种情况:二叉搜索树是有序的,对于某个结点来说,它的左子树结点<当前结点<右子树结点。所以从树的根节点开始和...

2020-02-23 11:20:34 131

原创 面试题67:把字符串转换成整数

题目:请写一个函数strToInt,实现把字符串转换成整数这个功能。不能使用自带的函数。分析:需要注意的点:输入是null或者空字符串或者不能转换成整数的一些乱码 输入了负数要考虑在内 输入了字符串转换成数字的溢出解法:package com.wsy;public class Main { public static void main(String[] a...

2020-02-23 10:44:43 121

原创 面试题66:构建乘积数组

题目:给定一个数组A[0,1,……,n-1],请构建一个数组B[0,1,……,n-1],其中B中的元素B[i]=A[0]×A[1]×……×A[i-1]×A[i+1]×……×A[n-1]。不能使用除法。分析:把B[i]=A[0]×A[1]×……×A[i-1]×A[i+1]×……×A[n-1]看成A[0]×A[1]×……×A[i-1]和A[i+1]×……×A[n-1]两部分的乘积,数组B可...

2020-02-22 23:28:39 82

原创 面试题65:不用加减乘除做加法

题目:请写一个函数,求两个整数的和,要求在函数体内不得使用“+”、“-”、“×”、“÷”四则运算符号。分析:考虑十进制下,我们是如何做加法运算的,比如5+17=22。可以分为3步。将各位相加,不进位,分别是5+7=2,1+0=1。 处理进位,5+7中有进位,进位值是10。 将第1步和第2步的结果相加,12+10=22=5+17。既然不能使用加减乘除,那么只能使用位运算了。5的...

2020-02-22 22:09:04 100

原创 面试题64:求1+2+……+n

题目:求1+2+……+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。分析:利用||和&&的短路规则,形成if的效果,再用递归形成循环的效果,实现求和。观察求和公式:,可以化简成,于是可以直接用n+n²的结果右移1实现。解法:package com.wsy;public class...

2020-02-22 21:32:42 294

原创 面试题63:股票的最大利润

题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?例如,一只股票在某些时间结点的价格为{9,11,8,5,7,12,16,14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。分析:定义一个函数f(i)表示以数组下标i处的值为卖出价格,能拿到的最大利润。在卖出价格固定时,买入价格越低,利润越大。在扫描到数组的...

2020-02-22 20:47:36 148

原创 面试题62:圆圈中最后剩下的数字

题目:0,1,……,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。分析:经典的解法,用环形链表模拟圆圈用环形链表来模拟圆圈,执行删除操作,因为链表的删除操作只需要改动引用,不需要移动元素,所以使用数组来模拟。创新的解法,拿到Offer不在话下首先定义一个函数f(n,m),表示n个人报数,每次删去报到m的人,最后...

2020-02-22 18:45:22 105

原创 面试题61:扑克牌中的顺子

题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。分析:将5张牌看做5个数字组成的数组,大、小王是特殊的数字,不妨把它定义为0,和其他扑克牌区分开。0可以充当任意数字,可以用0去填充数组中的空缺,如果排序后,数组不是连续的,可以统计相邻数字之间相差几个数字,目前有几个0,是否可...

2020-02-22 11:03:43 169

原创 面试题60:n个骰子的点数

题目:把n个骰子扔在地上,所有骰子朝上的一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。分析:n个骰子点数和最小值为n,最大值为6n。根据排列组合,n个骰子的所有点数的排列数为,需要先统计每个点数出现的次数,再把次数除以,就能求出每个点数出现的概率。基于对个求骰子点数,时间效率不够高先把n个骰子分成两堆:第一堆有1个,第二堆有n-1个。第一堆可能出现1~6的情况,...

2020-02-22 09:11:21 453

原创 面试题59:队列的最大值

题目:滑动窗口的最大值给定一个数字和滑动窗口的大小,请找出所有滑动窗口中的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,它们的最大值分别是{4,4,6,6,6,5}。分析:以数组{2,3,4,2,6,2,5,1}和滑动窗口的大小3为例分析。这里用一个双端队列辅助分析问题。从前到后遍历数组。第一个数字2,当前值的下标入队...

2020-02-21 12:34:41 269

原创 面试题58:翻转字符串

题目:翻转单词顺序输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student.”,则输出“student. a am I”。分析:第一步,对整句话翻转,“I am a student.”翻转得到“.tneduts a ma I”。第二步,对每个单词进行翻转,也就得到了“student. a...

2020-02-20 11:53:43 242

原创 面试题57:和为s的是数字

题目:和为s的两个数字。输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和为s,则输出任意一对即可。分析:例如,输入数组{1,24,7,11,15}和数字15。由于4+11=15,因此输出4和11。数组是有序的,这个条件要合理利用,用两个索引分别指向数组的头和尾,计算两个索引对应值的和,如果小于s,那么左索引需要右移,如果大于s,右...

2020-02-20 00:16:08 106

原创 面试题56:数组中数字出现的次数

题目:数组中只出现一次的两个数字。一个整型数组里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度O(n),空间复杂度O(1)。分析:例如,输入数组{2,4,3,6,3,2,5,5},因为只有4和6只出现了一次,其他数字出现了两次,所以输出4和6。先考虑这样一个问题,如果这个数组中,只有一个数组出现1次,其余数字都出现了2次,怎么找到这个出...

2020-02-19 22:20:58 118

原创 面试题55:二叉树的深度

题目:二叉树的深度输入一棵二叉树的根节点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。分析:如果一棵树只有一个结点,那么它的深度是1。树的深度是max(根节点左孩子深度,根节点右孩子深度)+1。解法:package com.wsy;class Tree { private int value; ...

2020-02-19 16:30:23 169

原创 面试题54:二叉搜索树的第k大结点

题目:给定一棵二叉搜索树,请找出其中第k大的结点。分析:对二叉搜索树的中序遍历结果,是一个从小到大的有序序列,要找第K大结点,可以将有序序列变成从大到小的,也就是使用右根左的顺序递归遍历,同时使用一个计数器,当计数器达到k的时候,就是第k大结点了。解法:package com.wsy;class Tree { private int value; priv...

2020-02-19 12:19:32 201

原创 面试题53:在排序数组中查找数字

题目:数字在排序数组中出现的次数。统计一个数字在排序数组中出现的次数。例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。分析:数组是有序的,自然想到用二分查找,二分查找到一个数据后,它的左右可能还有相同的数字,这时候,要向左右遍历,统计数量,考虑一个极端情况,假设数组中的数字全都相同,通过二分查找到中间数字后,继续向两侧判断和统...

2020-02-19 11:28:14 244

原创 面试题52:两个链表的第一个公共结点

题目:输入两个链表,找出它们的第一个公共结点。分析:首先画两个包含公共结点的链表,观察它们的形状,它们的形状是Y型的,在某一个结点重合后,后面的结点都是重合的。将两个链表分别入栈,因为两个链表尾部相同,对应到栈中,就是栈顶有一部分元素一一相等,依次将它们出栈,直到最后一个相等的元素为止,此时这个元素就是第一个公共子结点了。还有一个方案,先把两个链表的长度统计出来,计算它们的长度差,...

2020-02-18 23:33:52 152

原创 面试题51:数组中的逆序对

题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6)、(7,5)、(7,4)、(6,4)和(5.4)。分析:第一反应是顺序扫描整个数组,每扫描到一个数字,比较这个数字和它后面的数字的大小,如果后面的数字比它小,就构成一个逆序对。这种方法时间...

2020-02-18 22:27:08 347

原创 面试题50:第一个只出现一次的字符

题目:字符串中第一个只出现一次的字符。在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出b。分析:最直观的想法是从头开始向后扫描,如果某个字符,在后面没有发现重复的,并且是第一个,那么该字符就是第一个只出现一次的字符,时间复杂度O(n²),不是最佳的解决方案。创建一个256大小的int数组,统计字符串中每个字符出现的次数,最后根据字符串的顺序查找每个字符...

2020-02-18 17:26:05 172

原创 面试题49:丑数

题目:我们把只含因子2、3和5的数称作丑数。求按从小到大的顺序第1500个丑数。例如,6、8是丑数,但14不是,因为它包含因子7。习惯上我们把1当做第一个丑数。分析:逐个判断每个整数是不是丑数的解法,直观但不够高效根据丑数的定义,可以写一个函数,判断这个数是不是丑数,就用这个数不断整除以2,不断整除以3,不断整除以5,直到它变成1,如果能变成1,那么它就是丑数,否则就不是。接下...

2020-02-18 08:49:00 129

原创 面试题43:1~n整数中1出现的次数

题目:输入一个整数n,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1的数字有1、10、11和12,1一共出现了5次。分析:不考虑时间效率的解法,靠它想拿Offer有点难对于一个数,每次对10取余判断最低位是不是1,就可以得到这个数中1的数量,从1遍历到n,每个数都这么做,就可以得到1的总数量了。从数字规律着手明显提高时间效率的解法,能让面...

2020-02-17 20:35:36 453

原创 面试题48:最长不含重复字符的子字符串

题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含a~z的字符。例如,在字符串“arabcacfr”中,最长的不含重复字符的子字符串是“acfr”,长度为4。分析:我们定义函数f(i)表示以第i个字符为结尾的,不包含重复字符的子字符串的最长长度。我们从左到右逐一扫描字符串中的每个字符。当我们计算第i个字符为结尾的不包含重复字符的子字符...

2020-02-17 11:04:51 364

原创 面试题47:礼物的最大值

题目:在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或向下移动一格,直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?分析:这是一个动态规划问题,我们使用递归的思路分析。定义一个函数f(i,j)表示到达(i,j)的格子时能拿到的礼物总和的最大值。到达(i,j)有两种...

2020-02-16 23:21:53 235

原创 面试题46:把数字翻译成字符串

题目:给定一个数字,我们按照如下规则把它翻译成字符串:0翻译成a,1翻译成b……25翻译成z。一个数字可能有多个翻译。例如,12258有5种不同的翻译,分别是“bccfi”、“bwfi”、“bczi”、“mcfi”和“mzi”,请实现一个函数,用来计算一个数字有多少种不同的翻译方法。分析:我们一12258为例分析翻译过程。第一次翻译的时候,有两种选择:选1个数和选2个数,分别对应b和m...

2020-02-16 20:53:32 253

原创 面试题45:把数组排成最小的数

题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接处的所有数字中最小的一个。例如,输入数组{3,32,321},则打印出这三个数字能排成的最小数字321323。分析:n个数字有n!个排列,依次写出来对比它们的大小,时间开销太大。所以,如果我们能找出一个排序规则,数组中的数字根据这个规则进行排序,然后排成一个数字,它就是最小的。假设有n和m两个数字,要比较mn和nm...

2020-02-16 17:24:27 255

原创 面试题44:数字序列中某一位的数字

题目:数字以0123456789101112131415……的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第19位是4。请写一个函数,求任意第n为对应的数字。分析:假设要找地1001位数字,序列的前10位是0~9折10个只有1位的数字,1001位在这10个数字之后,从这个位置继续找1001-10=991位数字,后面的180位数字是90个10~99的两位数,99...

2020-02-16 16:50:03 457

原创 面试题42:连续子数组的最大和

题目:输入一个整型数组,数组里面有正数也有负数。数组中的一个或连续多个整数组成一个子数组。其所有子数组的和的最大值。要求时间复杂度为O(n)。分析:举例分析数组的规律应用动态规划法解法:举例分析数组的规律应用动态规划法...

2020-02-16 09:54:41 209

原创 面试题41:数据流中的中位数

题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。分析:数据是从数据流中读取出来的,数据是无序的,因此,我们需要一个容器将这些数据存储起来。数组,链表,时间复杂度都是O(n)的,一个是查询快,插入慢,另一个是查找慢,插入快。二叉搜索树,平衡二...

2020-02-15 22:48:40 127

原创 面试题40:最小的k个数

题目:输入n个整数,找出其中最小的k个整数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。分析:时间复杂度是O(n)的算法,只有当我们可以修改输入的数组时可用根据对快速排序的理解,当某次排序确定的第i个位置的下标正好是数组中的第k个数字,那么此时k以及k左侧的这k个数字就是最小的k个数字了,这k个数字可能是无序的,这不重要,我们找到了最小的k...

2020-02-15 18:46:03 275

原创 面试题39:数组中出现次数超过一半的数字

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。分析:如果已知的数组是有序的,那么很容易找到出现频次超过一半的数字,找中位数就是了。可是题目中的数组并不是有序的,如果使用排序算法将数组排序,需要O(nlogn)的时间,这种方法是不合适...

2020-02-15 15:50:57 811

原创 面试题38:字符串的排列

题目:输入一个字符串,打印出该字符串中字符的所有排列。例如,输入的字符串是abc,则打印出由字符串a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。分析:将一个字符串看成两部分组成:第一部分是它的第一个字符,第二部分是后面的所有字符。要求整个字符串的排列,第一步求所有可能出现在第一个位置的字符,也就是把第一个字符和后面的所有字符交换。第二步固定第一个...

2020-02-15 00:25:36 209

原创 面试题37:序列化二叉树

题目:分析:解法:

2020-02-14 18:58:45 97

原创 面试题36:二叉搜索树与双向链表

题目:输入一棵二叉搜索树,将该二叉搜索树转化长一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点的引用。分析:在二叉树中,每个结点都有两个指向子结点的引用。双向链表中,每个结点,也有两个引用分别对应前一个结点和后一个结点。由于这两种结点结构像是,同时二叉搜索树也是一种排序的数据结构。要求转换后的链表是排好序的,我们可以中序遍历二叉树的每个结点,因为对二叉排序树中序遍...

2020-02-13 23:29:34 89 1

原创 面试题35:复杂链表的复制

题目:请实现函数ComplexListNode clone(ComplexListNode head)复制一个复杂链表。在复杂链表中,每个结点除了一个next引用指向下一个结点,还有一个sibling引用指向任意结点或null。分析:第一种方法:第一步复制原始链表上的每个结点,并用next连接起来,第二步设置每个结点的sibling引用,在第二步设置sibling的时候,因为无...

2020-02-13 11:47:35 106

原创 ActiveMQ实践建议

消息转发模式ActiveMQ支持两种消息转发模式:PERSISTENT(持久化)和NON_PERSISTENT(非持久化)消息。ActiveMQ默认采用的是PERSISTENT模式,消息在发送到ActiveMQ服务端后被持久化(持久化方案有多种,比如JDBC、AMQ、KahaDB、LevelDB等),如果消息服务器出现故障,可以恢复此消息并将消息传送至消费者,这种模式保证消息只被传送一次和成功...

2020-02-13 08:12:21 496

原创 ActiveMQ笔记-目录

首先说下教程来源:https://www.bilibili.com/video/av55976700在这里,由衷的感谢尚硅谷的免费教程!根据视频的分p,把每个视频里的内容做了下整理,方便自己以后查看。如果有错误,欢迎大家指出,谢谢!如果有疑问,可以一起讨论,QQ:872452093。目录:01-前言说明02-两种讲授闲聊03-MQ的产品学习说明04-为什么要引入MQ_...

2020-02-12 17:16:00 213

原创 ActiveMQ笔记68-高级特性之防止重复调用

网络延迟传输中,会进行MQ的重试,可能会出现重复消费。如果一条消息是做数据库的插入操作,那么给这个消息做一个唯一主键,如果出现了重复消息,从数据库主键唯一性层面,导致主键冲突,可以避免重复插入数据。可以使用第三方服务来做消费记录,以redis为例,给消息分配一个全局id,只要消息消费过,将<id,message>写入redis,当消费者开始消费之前,先去redis里查看有没有消...

2020-02-12 16:41:13 530

原创 ActiveMQ笔记67-高级特性之死信队列

67

2020-02-12 16:32:29 638

原创 ActiveMQ笔记66-高级特性之消费重试机制

具体哪些情况会引起消息重发?Client用了事务且在session中调用了rollback() Client用了事务且在调用commit()前关闭或者没有commit() Client在CLIENT_ACKNOWLEDGE的传递模式下,在session中调用了recover()消息重发的间隔和重发次数是多少?消息重发的间隔是每秒钟重发6次。对有毒消息Poison ACK的理解。...

2020-02-11 22:47:16 618

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除