《剑指offer(牛客网)》
wickedvalley
好记性不如烂笔头
展开
-
《剑指offer》和为s的两个数字
题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述: 对应每个测试案例,输出两个数,小的先输出。解析:由于是递增的数组,所以找到一对数字就是乘机最小的了import java.util.ArrayList;import java.util.Collections;public class Solutio原创 2017-07-17 11:42:24 · 299 阅读 · 0 评论 -
《剑指offer》扑克牌顺序
题目:LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…..LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5原创 2017-07-18 13:36:48 · 428 阅读 · 0 评论 -
《剑指offer》翻转单词顺序列
题目:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?解析:没什么好说的了,注意空字符原创 2017-07-18 12:58:47 · 262 阅读 · 0 评论 -
《剑指offer》栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)原创 2017-07-09 15:32:04 · 198 阅读 · 0 评论 -
《剑指offer》包含min函数的栈
栈、list原创 2017-07-09 14:09:41 · 172 阅读 · 0 评论 -
《剑指offer》构建乘积数组
题目:给定一个数组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]。不能使用除法。解析:由于不能用除法,每一个i,都从A数组中j=0开始循环,j!=i,就累乘,然后给B[i]赋值import java.util.ArrayList;public class Solution { publi原创 2017-07-21 10:20:12 · 241 阅读 · 0 评论 -
《剑指offer》数组中重复的数字
题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。解析:利用选择排序的思想,当循环到到第i个元素的时候,从第i+1个元素开始找,找到第一个和第i个位置的元素相同的话就返回true。原创 2017-07-21 10:09:30 · 254 阅读 · 0 评论 -
《剑指offer》二叉树镜像
题目:操作给定的二叉树,将其变换为源二叉树的镜像。二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5 解析:利用递原创 2017-07-08 15:39:46 · 186 阅读 · 0 评论 -
《剑指offer》链表中倒数第k个结点
题目:输入一个链表,输出该链表中倒数第k个结点。解析:需要逆向输出节点,可以正向把所有的节点都保存到list里,然后再逆向的输出/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/imp原创 2017-07-07 23:13:49 · 213 阅读 · 0 评论 -
《剑指offer》左旋转字符串
题目:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!解析:显然,利用队列的知识点很容易解决该旋转问题,思想就是把队首的元素出队,然后再加到队尾就行了 impo原创 2017-07-17 12:01:42 · 248 阅读 · 0 评论 -
《剑指offer》把字符串转为整数
题目:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 示例1输入:+2147483647 1a33输出:2147483647 0解析:如果你用库函数做,相信这题没神马好做得了。那么我们如何自己去原创 2017-07-20 11:31:20 · 228 阅读 · 0 评论 -
《剑指offer》字符流中第一个不重复的字符
题目:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符。解析:思想就是从当前的字符往后找以及往前找,该字符的前方以及后方均没有重复的才算是第一次出现的字符了,需要返回该字符。没原创 2017-07-22 10:39:46 · 377 阅读 · 0 评论 -
《剑指offer》链表中环的入口节点
题目:一个链表中包含环,请找出该链表的环的入口结点。解析:思想是用list存储从头开始遍历的链表节点,如果list集合不存在该节点,就把该节点添加进list,然后继续遍历下一个。当list中包含当前节点了,说明链表中有环了,而当前节点就是环的入口节点/* public class ListNode { int val; ListNode next = null; ListNo原创 2017-07-22 11:30:16 · 383 阅读 · 0 评论 -
《剑指offer》求1+2+3+...n(不用if、else、乘除等)
题目:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。解析:题目提示已经很明显了,需要大家用A?B:C法解题了。当然得用递归了,那么递归的退出条件是什么?明显n==1就可以退出了。public class Solution { public int Sum_Solution(int n) {原创 2017-07-19 10:04:05 · 545 阅读 · 2 评论 -
《剑指offer》合并两个排序的链表
题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解析:先把两个链表的值都取出来放在list里,再对值排序,排完序后就创建链表返回/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val原创 2017-07-08 15:29:39 · 213 阅读 · 0 评论 -
《剑指offer》数据流中的中位数
题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。解析:由于数据是动态的添加的,不用移除,所以用list存储添加进去的数值。关键点是在获取数据流中的中位数。注意:需要先给list排序判断list里面的数值的个数的奇偶性。如果是list的大小是奇数,例如里面存储原创 2017-07-27 10:04:25 · 205 阅读 · 0 评论 -
《剑指offer》反转链表
题目:输入一个链表,反转链表后,输出链表的所有元素。解析:首先把所有的节点都存到list,然后用集合框架工具Collections的翻转方法把该链表翻转,然后根据集合节点创建单链表返回/*public class ListNode { int val; ListNode next = null; ListNode(int val) {原创 2017-07-07 23:28:44 · 231 阅读 · 0 评论 -
《剑指offer》序列化二叉树
题目:请实现两个函数,分别用来序列化和反序列化二叉树解析:首先存储二叉树的先序遍历,遇到null就添加”#,” 否则添加“值,”。构件二叉树的时候也是用先序遍历构件。/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(in原创 2017-07-26 10:12:11 · 250 阅读 · 0 评论 -
《剑指offer》给定一颗二叉搜索树,请找出其中的第k大的结点。
题目:给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。解析:看到我写的下面的代码,像一篇文章一样的长,我也是醉了,先提交上去了。思想就是先来个层次遍历二叉树,得到所有的节点的值,然后再排序,取到第k大的节点的值。当然这个只是值,而不是节点,需要得到具体的节点信息,我们需要再重新遍历下该二叉树,得到节点值为原创 2017-07-26 09:41:50 · 663 阅读 · 0 评论 -
《剑指offer》非递归法判定二叉树是否是对称的
题目:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。解析:该非递归法有点傻傻的,思想是利用队列进行层次遍历。然后翻转该二叉树,再层次遍历该二叉树,最后对比 两棵树的节点值是否一样的,一样的则是对称的,不一样的就不对称了。import java.util.*;/*public class TreeNode { int val原创 2017-07-25 10:02:52 · 938 阅读 · 0 评论 -
《剑指offer》按之字行顺序打印二叉树
题目:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。解析:和之前的层次遍历二叉树一样的思想,只不过本题需要按照之字行遍历。只需要用一个index标识下就好了。index为奇数,就正序添加,否则,把该list翻转,然后添加进去。详情见代码import java.util.*;/*public clas原创 2017-07-25 09:51:02 · 348 阅读 · 0 评论 -
《剑指offer》把二叉树打印成多行
题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。解析:层次遍历二叉树,要点是要用队列存储节点信息。还有个问题,如何知道要换层?答案是用一个计数器current指示当前层的节点个数,next记录下一层的节点个数,每次出队一次就current减1,直到current为0,就知道当前层遍历完了,再把下一层的next值赋值给当前current,next值为0,重新计数。具体的操作见代码原创 2017-07-24 23:01:38 · 692 阅读 · 0 评论 -
《剑指offer》二叉树的下一个节点
题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。解析:主要分两大类。一类:该节点有右子树,则找到右子树的最左边的节点返回;二类是该孩子没有右子树,又可以分为两类。1.该节点就是左孩子了,直接找到它的父节点;2.不是左孩子,继续向上遍历其父节点的父节点,重复之前的判断,返回结果/*public class T原创 2017-07-23 11:09:42 · 314 阅读 · 0 评论 -
《剑指offer》删除链表中重复的节点
题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5解析:思想是用集合list存储所有没有重复的元素,然后构造单链表返回就好了。/* public class ListNode { int val; ListNode next = null; List原创 2017-07-23 10:49:11 · 346 阅读 · 0 评论 -
《剑指offer》孩子们的游戏---约瑟夫问题
题目:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数….这样下去….直到剩下最后一个原创 2017-07-19 11:45:31 · 391 阅读 · 2 评论 -
《剑指offer》不用加减乘除做加法
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。解析:题目要求是函数体内不出现四则运算符号就好了,那就用math包里的BigDecimal解答import java.math.BigDecimal;public class Add { public static int Add(int num1,int num2) { BigDecima原创 2017-07-20 10:29:57 · 206 阅读 · 0 评论 -
《剑指offer》调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解法一:用两个list分别存储奇数以及偶数,然后合并list,再把list存到原来的数组里import java.util.ArrayList;import java.util.Collections;原创 2017-07-06 23:13:43 · 181 阅读 · 0 评论 -
《剑指offer》和为s的连续正数序列
题目:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述: 输出所有和为S的连续正数序列。序列内按原创 2017-07-16 13:30:56 · 329 阅读 · 0 评论 -
《剑指offer》跳台阶
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分析:第n阶台阶要么由第n-1阶跳来,要么由n-2阶跳来,所有总共有f(n)=f(n-1)+f(n-2)种跳法,故解法用递归解了public class Solution { public int JumpFloor(int target) { if(target==1|原创 2017-07-03 22:42:45 · 201 阅读 · 0 评论 -
《剑指offer》斐波那契数列
题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n解答方式:利用递归的思想,需要注意的是,是从0项开始的public class Solution { //0 1 1 2 3 5 8 13 21 //0 1 2 3 4 5 6 7 8 9 public int Fibonacci(int n) {原创 2017-07-03 21:28:51 · 201 阅读 · 0 评论 -
《剑指offer》整数中1出现的次数(从1到n整数中1出现的次数)
题目:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。解析:暴力的干吧,直接两个for循环后就可以完事public class Solution { publi原创 2017-07-12 16:15:39 · 183 阅读 · 0 评论 -
《剑指offer》连续子数组的最大和
题目:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至少是原创 2017-07-12 15:51:56 · 205 阅读 · 0 评论 -
《剑指offer》最小的k个数
题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解析:剑指offer刷到现在,大家可能都有个很大的感触,那就是要非常熟悉java.util包里的常用工具类,在做题时候会极大的帮助我们加快解题速度。代码如下,只要排个序,想要k几个数就k几个。当然要在合法的范围内干事,可不能越界了!import java.util.Arra原创 2017-07-12 15:30:57 · 276 阅读 · 0 评论 -
《剑指offer》数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 解析一:简单思维,时间复杂度为O(n2)。直接先去重,然后对每个数做记数,超过一半就输出。import java.util.*;public class Solution {原创 2017-07-11 20:51:20 · 240 阅读 · 0 评论 -
《剑指offer》旋转数组的最小数字
该题比较轻松实现方式一:直接不用动脑筋方式,直接排序,取第最小值,时间复杂度较高,可以尝试方式二import java.util.*;public class Solution { public int minNumberInRotateArray(int [] array) { if(array.length==0){ return 0;原创 2017-07-01 17:21:32 · 201 阅读 · 0 评论 -
《剑指offer》字符串的排列
题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。解析:如果各位想一下吞口大胖子,大家可能会想多了,这题不仅仅需要全排列、还需要去重以及排序,主要先做全排列,后面的就好做了。impor原创 2017-07-11 17:04:34 · 238 阅读 · 0 评论 -
《剑指offer》用两个栈实现队列
废话还是不啰嗦了,直接上代码了实现方式一:比较傻傻的方法,直接用第一个栈stack1实现压栈,弹栈的话稍微麻烦点了,先把第一个栈的数据压到第二个栈,然后再把第二个栈数据压入第一个栈import java.util.Stack;public class Solution { Stack stack1 = new Stack(); Stack stack2 = new St原创 2017-07-01 17:11:35 · 339 阅读 · 0 评论 -
《剑指offer》从上往下打印二叉树
题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。解析:此题利用队列可以很好的解决层次打印,只需要按顺序入队以及出队就可以了(一点说明:root为null的时候需要考虑,java中的队列是Queue,实现类LinkedList,而方法poll是移除并返回队首元素)import java.util.ArrayList;/**public class TreeNode { int原创 2017-07-10 22:52:34 · 178 阅读 · 0 评论 -
《剑指offer》从尾到头打印链表
此题的解法较多,编程期间需要注意的是,如果有头结点的话,该节点是有值的,废话少说,上代码实现方式一:直接用list存储元素,然后用Collections工具类里的翻转方法把该list翻转就可以了import java.util.*;public class Solution { public ArrayList printListFromTailToHead(ListNode l原创 2017-06-30 13:56:15 · 245 阅读 · 0 评论 -
《剑指offer》变态跳台阶
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分析:由上一篇跳台阶知道f(n)=f(n-1)+f(n-2)种,现在可以跳n阶,则,f(n)=f(n-1)+f(n-2)+.....f(n-n)种,即第n阶依赖于前面所有的可能性之和,所以可以用动态规划的思想解决public class Solution { //动态原创 2017-07-03 23:06:41 · 168 阅读 · 0 评论