剑指Offer(Java版)
北极星小王子
得之坦然,失之淡然,争之必然,顺义自然
展开
-
剑指Offer(六十一)序列化二叉树(Java版 )
一、题目描述请实现两个函数,分别用来序列化和反序列化二叉树二、代码分析public class Solution { public int index = -1; //序列化 public String Serialize(TreeNode root) { StringBuffer sb = new StringBuffer(); ...原创 2018-06-29 10:07:27 · 311 阅读 · 1 评论 -
剑指Offer(四十七)求1+2+3+...n的和(Java版 )
一、题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。二、代码分析既然乘法之类的都不能用了,那就只能用递归了: public class Solution { public int Sum_Solution(int n) { int sum = n; ...原创 2018-06-26 17:14:11 · 672 阅读 · 0 评论 -
剑指Offer(四十六)孩子们的游戏(圆圈里最后剩下的数)(Java版 )
一、题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数….这样下去….直到...原创 2018-06-26 17:07:55 · 275 阅读 · 0 评论 -
剑指Offer(四十五)扑克牌顺子(Java版 )
一、题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…..LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为1...原创 2018-06-26 16:43:43 · 248 阅读 · 0 评论 -
剑指Offer(四十四)左旋转字符串(Java版 )
一、题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!二、代码分析public class Solution { public St...原创 2018-06-26 16:31:36 · 149 阅读 · 0 评论 -
剑指Offer(四十三)翻转单词顺序列(Java版 )
一、题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?二、代码分析...原创 2018-06-26 16:18:03 · 293 阅读 · 0 评论 -
剑指Offer(四十二)和为S的两个数字(Java版 )
一、题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。二、代码分析这题和上一题有异曲同工之处:import java.util.ArrayList;public class Solution { /* * i,j分别表示数组两端下表 * 当array[i]+array[j...原创 2018-06-26 15:54:20 · 371 阅读 · 0 评论 -
剑指Offer(四十一)和为S的连续整数序列(Java版 )
一、题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输出格式:输出所有和为S的连续正数序...原创 2018-06-26 15:44:54 · 321 阅读 · 0 评论 -
剑指Offer(三十)连续子数组的最大和(Java版 )
一、题目描述输入一个整型数组,数组里有正数和负数,数组中一个或者多个连续的数字组成一个子数组,求所有子数组的最大值,要求时间复杂度为O(N)二、代码分析算法时间复杂度O(n)用total记录累计值,maxSum记录和最大 基于思想:对于一个数A,若是A的左边累计数非负,那么加上A能使得值不小于A,认为累计值对整体和是有贡献的。如果前几项累计值负数,则认为有害于总和,total记录当前...原创 2018-06-19 17:22:36 · 203 阅读 · 0 评论 -
剑指Offer(二十九)最小的k个数(Java版 )
一、题目描述原创 2018-06-19 17:11:00 · 358 阅读 · 0 评论 -
剑指Offer(二十八)数组中出现次数超过一半的数字(Java版 )
一、题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。二、代码描述思路:O(n)的思想是,定义两个变量result 和count,每次循环时,如果array[i]的值等于result ,则count自增,如不等并且cou...原创 2018-06-19 10:53:18 · 218 阅读 · 0 评论 -
剑指Offer(二十七)字符串排列(Java版 )
一、题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。二、代码描述import java.util.*;//字典序算法//步骤如下://1.从这个序列中从右至左找第一个左邻小于右邻的字符,记录下标为index1 ,如果找不到,说明求解完成。//2....原创 2018-06-19 10:38:03 · 279 阅读 · 0 评论 -
剑指Offer(二十六)二叉搜索树与双向链表(Java版 )
一、题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。二、代码分析/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int va...原创 2018-06-19 10:31:08 · 296 阅读 · 0 评论 -
剑指Offer(二十五)复杂链表的复制(Java版 )
一、题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)二、代码描述/*public class RandomListNode { int label; RandomListNode next = n...原创 2018-06-19 09:58:57 · 335 阅读 · 0 评论 -
剑指Offer(四十八)不用乘除做加减法(Java版 )
一、题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。二、代码分析 思路:首先看十进制是如何做的: 5+7=12,三步走 第一步:相加各位的值,不算进位,得到2。 第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。 第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。 同样我们...原创 2018-06-26 17:22:41 · 238 阅读 · 0 评论 -
剑指Offer(三十一)整数中1出现的次数(Java版 )
一、题目描述求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。...原创 2018-06-20 09:21:13 · 196 阅读 · 0 评论 -
剑指Offer(六十)把二叉树打印成多行(Java版 )
一、题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。二、代码分析public class Solution { ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { ArrayList<ArrayList<Integer>> resul...原创 2018-06-29 10:02:07 · 466 阅读 · 0 评论 -
剑指Offer(五十九)按之字形顺序打印二叉树(Java版 )
一、题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。二、代码分析import java.util.*;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right ...原创 2018-06-29 09:55:30 · 237 阅读 · 0 评论 -
剑指Offer(五十八)二叉树对称(Java版 )
一、题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。二、代码分析public class Solution { boolean isSymmetrical(TreeNode pRoot) { return isSymmetrical(pRoot,pRoot); } //...原创 2018-06-29 09:45:55 · 250 阅读 · 0 评论 -
剑指Offer(五十七)二叉树的下一个结点(Java版 )
一、题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。二、代码描述中序遍历的顺序为:左根右 1、有右子树的,那么下个结点就是右子树最左边的点; 2、没有右子树的,也可以分成两类,如果是父节点左孩子 ,那么父节点就是下一个节点 ;如果是父节点的右孩子找他的父节点的父节点的父节点…直到当前结...原创 2018-06-28 09:05:59 · 677 阅读 · 0 评论 -
剑指Offer(五十六)删除链表中重复的结点(Java版 )
一、题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5二、代码分析public class Solution { public ListNode deleteDuplication(ListNode p...原创 2018-06-27 16:32:10 · 366 阅读 · 0 评论 -
剑指Offer(五十五)链表中环的入口节点(Java版 )
一、题目描述一个链表中包含环,请找出该链表的环的入口结点。二、代码分析import java.util.*;public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) { HashSet<ListNode> set = new HashSet<List...原创 2018-06-27 16:09:49 · 273 阅读 · 0 评论 -
剑指Offer(五十四)字符流中第一个不重复的字符(Java版 )
一、题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。 输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符。二、代码分析import java.util.*;public class Solution ...原创 2018-06-27 15:54:45 · 308 阅读 · 0 评论 -
剑指Offer(五十三)表示数值的字符串(Java版 )
一、题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。二、代码分析利用正则表达式:public class Solution { public boolean isNum...原创 2018-06-27 15:48:10 · 283 阅读 · 0 评论 -
剑指Offer(五十二)正则表达式匹配(Java版 )
一、题目描述请实现一个函数用来匹配包括点和星号的正则表达式。模式中的字符点表示任意一个字符,而 星号表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配二、代码分析public class Solution { public bool...原创 2018-06-27 15:40:48 · 365 阅读 · 0 评论 -
剑指Offer(五十一)构建乘积数组(Java版 )
一、题目描述给定一个数组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[0] = A[1] * A[2] * A[3] * A[4] *....*A[n-1] ;(没有A[0])B[1 ]= A[0] * A[2] * A[3]...原创 2018-06-27 15:24:13 · 207 阅读 · 0 评论 -
剑指Offer(五十)数组中重复的数(Java版 )
一、题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。二、代码分析利用Set集合的不可重复性:import java.util.*;public class ...原创 2018-06-27 11:29:24 · 175 阅读 · 0 评论 -
剑指Offer(四十九)把字符串转换成整数(Java版 )
一、题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。二、代码分析public class Solution { public int StrToInt(String str) { if (str.equals(&quot;&quot;) || str.length() == 0)//空字符串情况 ...原创 2018-06-27 08:23:45 · 658 阅读 · 0 评论 -
剑指Offer(三十二)把数组排成最小的数(Java版 )
一、题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。二、代码分析/* 解题思路: * 考虑到大数问题,先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来。关键就是制定排序规则。 * 排序规则如下: *...原创 2018-06-20 11:28:00 · 274 阅读 · 0 评论 -
剑指Offer(四十)数组中只出现一次的数(Java版 )
一、题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。二、题目分析Step1:首先,看下这个问题的简化版: 很多成对出现数字保存在磁盘文件中,注意成对的数字不一定是相邻的,如2, 3, 4, 3, 4, 2……,由于意外有一个数字消失了,如何尽快的找到是哪个数字消失了? 这里可以利用异或运算的特性。自己与自己相异或得0,自己与0...原创 2018-06-25 16:25:26 · 237 阅读 · 0 评论 -
剑指Offer(三十九)平衡二叉树(Java版 )
一、题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。二、代码分析public class Solution { //后续遍历时,遍历到一个节点,其左右子树已经遍历 依次自底向上判断,每个节点只需要遍历一次 private boolean isBalanced=true; public boolean IsBalanced_Solution(TreeN...原创 2018-06-25 15:48:32 · 284 阅读 · 0 评论 -
剑指Offer(三十四)第一个只出现一次的字符(Java版 )
一、题目描述在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置。二、题目分析import java.util.LinkedHashMap;// use linkedhashmap to keep the orderpublic class Solution { public int FirstNotRepe...原创 2018-06-21 16:46:14 · 170 阅读 · 0 评论 -
剑指Offer(三十三)丑数(Java版 )
一、题目描述把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。二、题目分析方法一: 最简单的方法就是先通过将一个数不断除以2,3,5来判定该数是不是丑数,而后在从1开始,依次往后判断每个数是不是丑数,并记下丑数的个数,这样当计算的个数为给定值时,便是需要求的...原创 2018-06-21 16:28:17 · 707 阅读 · 0 评论 -
剑指Offer(十六)合并两个排序的链表(Java版 )
一、题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。二、代码分析/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public clas...原创 2018-06-13 17:02:38 · 157 阅读 · 0 评论 -
剑指Offer(十五)反转链表(Java版 )
一、题目描述输入一个链表,反转链表后,输出链表的所有元素。二、方法分析第一次循环: 第二次循环: 三、代码分析/*/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/pub...原创 2018-06-13 16:08:24 · 201 阅读 · 0 评论 -
剑指Offer(十四)链表中倒数第k个结点(Java版 )
一、题目描述输入一个链表,输出该链表中倒数第k个结点二、题目分析考虑到输出倒数第k个结点,“倒数”,想到了栈。import java.util.*;public class Solution { public ListNode FindKthToTail(ListNode head,int k) { //是空的话返回Null if( hea...原创 2018-06-13 11:14:32 · 578 阅读 · 0 评论 -
剑指Offer(十三)调整数组顺序使奇数位于偶数前面(Java版 )
一、题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。二、方法分析整体思路: 首先统计奇数的个数,然后新建一个等长数组,设置两个指针,奇数指针从0开始,偶数指针从奇数个数的末尾开始 遍历,填数三、代码分析public class Solution ...原创 2018-06-13 10:37:40 · 122 阅读 · 0 评论 -
剑指Offer(十二)数值的整数次方(Java版 )
一、题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。二、代码分析public class Solution { public double Power(double base, int exponent) { int flag = 0; if( exponent &lt; 0 ...原创 2018-06-13 09:44:08 · 334 阅读 · 0 评论 -
剑指Offer(十一)二进制中1的个数(Java版 )
一、题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。二、直接上代码分析public class Solution { public int NumberOf1(int n) { int count = 0; int k = 0x01; if( n == 0 ) count = 0; //先不...原创 2018-06-12 17:10:43 · 154 阅读 · 0 评论 -
剑指Offer(十)矩形覆盖(Java版 )
一、题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?二、题目分析第一块有两种方式:横着放和竖着放 横着放对应方法为f(n-2); 竖着放下一步的放方法为f(n-1); 所以总的放的方法为f(n)=f(n-1)+f(n-2); 画一张图来描述下: 三、方法一:递归public cla...原创 2018-06-12 16:11:25 · 293 阅读 · 0 评论