剑指Offer
武培轩
这个作者很懒,什么都没留下…
展开
-
剑指Offer-求1+2+3+...+n
题目描述求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路思路一:利用逻辑与的短路特性实现递归终止。 当n==0时,(n>0)&&((sum+=Sum_Solution(n-1))>0)只执行前面的判断,为false,然后直接返回0; 当n>0时,执...原创 2018-03-22 13:55:00 · 209 阅读 · 0 评论 -
剑指Offer-调整数组顺序使奇数位于偶数前面
剑指Offer-调整数组顺序使奇数位于偶数前面 题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路思路一:首先统计奇数的个数,然后拷贝一个数组,设置两个指针,奇数指针从0开始,偶数指针从奇数个数的末尾开始遍历...原创 2018-04-11 13:21:00 · 191 阅读 · 0 评论 -
剑指Offer-字符流中第一个不重复的字符
剑指Offer-字符流中第一个不重复的字符 题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。思路使用一个Li...原创 2018-03-22 14:08:00 · 111 阅读 · 0 评论 -
剑指Offer-把数组排成最小的数
剑指Offer-把数组排成最小的数 题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路可以看成是一个排序问题,先将整型数组转换成String数组,在比较两个字符串 o1 和 o2 的大小时,应该比较的是 o...原创 2018-04-10 17:11:00 · 170 阅读 · 0 评论 -
剑指Offer-栈的压入、弹出序列
剑指Offer-栈的压入、弹出序列 题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路...原创 2018-03-31 16:37:00 · 99 阅读 · 0 评论 -
剑指Offer-数字在排序数组中出现的次数
剑指Offer-数字在排序数组中出现的次数 题目描述统计一个数字在排序数组中出现的次数思路思路一:暴力,简单粗暴,但是并不可取思路二:因为题中说是排序数组,因此我们要先想到二分查找,因此我们先用二分查找找出某个k出现的位置,然后再分别向前和向后查找总的个数。思路三:还是二分查找的思想,先找到第一个k和最后一个k的位置相减代码实现pac...原创 2018-03-30 22:58:00 · 153 阅读 · 0 评论 -
剑指Offer-孩子们的游戏(圆圈中最后剩下的数)
剑指Offer-孩子们的游戏(圆圈中最后剩下的数) package Other;import java.util.LinkedList;/** * 孩子们的游戏(圆圈中最后剩下的数) * 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。 * 其中,有个游戏是这样...原创 2018-03-22 16:11:00 · 201 阅读 · 0 评论 -
剑指Offer-第一个只出现一次的字符位置
剑指Offer-第一个只出现一次的字符位置 题目描述在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置思路思路一:使用整型数组对出现次数进行统计。思路二:使用BitSet对出现次数进行统计。 0,1,更多代码实现package String;import jav...原创 2018-04-18 23:58:00 · 230 阅读 · 0 评论 -
剑指Offer-二叉搜索树的第k个结点
剑指Offer-二叉搜索树的第k个结点 题目描述给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / 3 7 //2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。思路利用二叉搜索数中序遍历有序的特点。用递归和迭代分别实现中序遍历。代码实现package Tree;import java.util.Stack;...原创 2018-04-17 15:30:00 · 120 阅读 · 0 评论 -
剑指Offer-二叉搜索树的后序遍历序列
剑指Offer-二叉搜索树的后序遍历序列 题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路对于后序遍历来说,序列数组的最后一个元素一定是根节点,则根据这个元素,将前面的数组分为左、右两个部分,左侧部分都小,右侧部分都大,如果右侧部分有比该根节...原创 2018-04-19 16:52:00 · 157 阅读 · 0 评论 -
剑指Offer-数组中只出现一次的数字
剑指Offer-数组中只出现一次的数字 题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路思路一:利用HashSet的元素不能重复,如果有重复的元素,则删除重复元素,如果没有则添加,最后剩下的就是只出现一次的元素思路二:用HashMap<K,V>保存数组的值,key为数组...原创 2018-03-31 17:48:00 · 116 阅读 · 0 评论 -
剑指Offer-两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。思路思路一:先把pHead1放入HashMap中,根据HashMap的containsKey方法,查询是否有相同的节点思路二:找出2个链表的长度,然后让长的先走两个链表的长度差,然后再一起走(因为2个链表用公共的尾部)思路三:设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a...原创 2018-03-22 13:50:00 · 193 阅读 · 0 评论 -
剑指Offer-数组中出现次数超过一半的数字
剑指Offer-数组中出现次数超过一半的数字 题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路思路一:利用HashMap记录每个数字以及数字出现的次数,没出现过的就放进...原创 2018-04-08 11:44:00 · 110 阅读 · 0 评论 -
剑指Offer-整数中1出现的次数(从1到n整数中1出现的次数)
题目描述求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1 ~ 13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。思路把整数转换为字符串,遍历每一位判断是否为1代码实现package Oth...原创 2018-03-22 13:49:00 · 182 阅读 · 0 评论 -
剑指Offer-连续子数组的最大和
题目描述在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。(子向量的长度至少是1)思路遍历array,对于每一个数字,我们判断,(之前的sum + 这个数字) 和...原创 2018-03-22 13:48:00 · 156 阅读 · 0 评论 -
剑指Offer-二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路思路一:用flag来与n的每位做位于运算,来判断1的个数思路二:如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。思路三:用Inte...原创 2018-03-22 13:41:00 · 158 阅读 · 0 评论 -
剑指Offer-和为S的连续正数序列
剑指Offer-和为S的连续正数序列 题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和...原创 2018-04-01 19:54:00 · 198 阅读 · 0 评论 -
剑指Offer-按之字形顺序打印二叉树
package Tree;import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;/** * 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。 * 思路: * 先按层次输出二叉树 *...原创 2018-03-22 14:13:00 · 211 阅读 · 0 评论 -
剑指Offer-二叉搜索树与双向链表
剑指Offer-二叉搜索树与双向链表 题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路思路一:由于要求链表是有序的,可以借助二叉树中序遍历,因为中序遍历算法的特点就是从小到大访问结点。中序遍历过程中,根节点不断加到右边,这样可以保持从左到右升序。由于中序遍历过...原创 2018-03-31 23:34:00 · 208 阅读 · 0 评论 -
剑指Offer-把字符串转换成整数
剑指Offer-把字符串转换成整数 package String;/** * 把字符串转换成整数 * 题目描述 * 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0 * 输入描述: * 输入一个字符串,包括数字字母符号,可以为空 * 输出描述: * 如果是合法的数值表达...原创 2018-03-22 14:00:00 · 117 阅读 · 0 评论 -
剑指Offer-把二叉树打印成多行
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路按层次输出二叉树访问根节点,并将根节点入队。当队列不空的时候,重复以下操作。弹出一个元素。作为当前的根节点。 如果根节点有左孩子,访问左孩子,并将左孩子入队。 如果根节点有右孩子,访问右孩子,并将右孩子入队。代码实现package Tree;import java.util.Arr...原创 2018-03-22 14:15:00 · 196 阅读 · 0 评论 -
剑指Offer-链表中倒数第k个结点
剑指Offer-链表中倒数第k个结点 题目描述输入一个链表,输出该链表中倒数第k个结点。思路为了能够只遍历一次就能找到倒数第k个节点,可以定义两个指针:快指针从链表的头指针开始遍历向前走k-1,慢指针保持不动;从第k步开始,慢指针也开始从链表的头指针开始遍历;由于两个指针的距离保持在k-1,当快指针到达链表的尾结点时,慢指针正好是倒数...原创 2018-04-15 13:16:00 · 183 阅读 · 0 评论 -
剑指Offer-删除链表中重复的结点
剑指Offer-删除链表中重复的结点 package LinkedList;/** * 删除链表中重复的结点 * 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 * 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5...原创 2018-03-22 14:11:00 · 133 阅读 · 0 评论 -
剑指Offer-链表中环的入口结点
剑指Offer-链表中环的入口结点 题目描述一个链表中包含环,请找出该链表的环的入口结点。思路思路一:利用HashSet元素不能重复思路二:假设x为环前面的路程,a为环入口到相遇点的路程, c为环的长度当快慢指针相遇的时候: 此时慢指针走的路程为Sslow = x + m * c + a快指针走的路程为Sfast = x + n *...原创 2018-03-22 14:10:00 · 160 阅读 · 0 评论 -
剑指Offer-二叉树中和为某一值的路径
剑指Offer-二叉树中和为某一值的路径 题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路回溯法二叉树的深度优先遍历+每次遍历均判断是否达到条件,若是则输出root入栈,跳入该子树进行寻路操作若root的这条路径,已满足要求,则将该...原创 2018-04-10 11:11:00 · 171 阅读 · 0 评论 -
剑指Offer-和为S的两个数字
剑指Offer-和为S的两个数字 题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。思路思路一:数列满足递增,设首尾两个变量left和right若array[left] + array[right]...原创 2018-03-31 01:32:00 · 173 阅读 · 0 评论 -
剑指Offer-从上往下打印二叉树
剑指Offer-从上往下打印二叉树 题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路使用两个队列一个存放节点,一个存放值。先将根节点加入到队列中,然后遍历队列中的元素,遍历过程中,访问该元素的左右节点,再将左右子节点加入到队列中来代码实现package Tree;import java.util.ArrayList;...原创 2018-04-09 11:21:00 · 175 阅读 · 0 评论 -
剑指Offer-数组中重复的数字
剑指Offer-数组中重复的数字 题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。思路数组中的数字都在0到n-1的数字...原创 2018-03-22 14:04:00 · 117 阅读 · 0 评论 -
剑指Offer-二维数组中的查找
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路思路一:暴力,时间复杂度O(mn)O(mn)思路二:利用二维数组由上到下,由左到右递增的规律,那么选取左下角或者右上角的元素a[i][j]与target进行比较,当target大于元素a[i][j]...原创 2018-03-22 13:18:00 · 94 阅读 · 0 评论 -
剑指Offer-表示数值的字符串
剑指Offer-表示数值的字符串 题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。思路思路一:利用正则表达式,对字符串中的每个字符进行判...原创 2018-04-08 09:36:00 · 219 阅读 · 0 评论 -
剑指Offer-包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。思路用一个栈data保存数据,用另外一个栈min保存入栈最小的数代码实现package Stack;import java.util.Stack;/** * 包含min函数的栈 * 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。 * 思路: * 用一个栈dat...原创 2018-03-22 13:47:00 · 129 阅读 · 0 评论 -
剑指Offer-二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7...原创 2018-03-22 13:45:00 · 115 阅读 · 0 评论 -
剑指Offer-从尾到头打印链表
题目描述输入一个链表,从尾到头打印链表每个节点的值。思路思路一:递归方法思路二:从尾到头打印,很明显先进后出,利用栈,栈先进后出代码实现package LinkedList;import java.util.ArrayDeque;import java.util.ArrayList;import java.util.Deque;/** * 输入一个...原创 2018-03-22 13:27:00 · 107 阅读 · 0 评论 -
剑指Offer-滑动窗口的最大值
剑指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...原创 2018-04-19 12:55:00 · 176 阅读 · 0 评论 -
剑指Offer-斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39思路思路一:用递归求解,F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)思路二:用迭代方法,用两个变量记录fn-1和fn-2代码实现package Recursion;/** * 题目描述 * 大家都知道斐波那契数列,现在要...原创 2018-03-22 13:34:00 · 109 阅读 · 0 评论 -
剑指Offer-反转链表
剑指Offer-反转链表 题目描述输入一个链表,反转链表后,输出链表的所有元素。思路思路一:迭代:将当前节点和下一节点保存起来,然后将当前节点反转。思路二:递归:利用递归走到链表的末端,然后再更新每一个节点的next值 ,实现链表的反转。代码实现package LinkedList;/** * 反转链表 * 输入一个链表,反...原创 2018-03-31 15:13:00 · 113 阅读 · 0 评论 -
剑指Offer-平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路思路一:遍历每个结点,借助一个获取树深度的递归函数,根据该结点的左右子树高度差判断是否平衡,然后递归地对左右子树进行判断。时间复杂度:思路二:从下往上遍历,如果子树是平衡二叉树,则返回子树高度,否则返回-1。时间复杂度:代码实现package Tree;/** * 平衡二叉树 * 输入一棵二叉树,判...原创 2018-03-22 13:53:00 · 102 阅读 · 0 评论 -
剑指Offer-对称的二叉树
剑指Offer-对称的二叉树 package Tree;/** * 对称的二叉树 * 请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。 */public class Solution28 { /** * 用递归 * * @param p...原创 2018-03-22 14:12:00 · 124 阅读 · 0 评论 -
剑指Offer-左旋转字符串
剑指Offer-左旋转字符串 package String;/** * 左旋转字符串 * 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。 * 对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。 * 例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,...原创 2018-03-27 23:28:00 · 142 阅读 · 0 评论 -
剑指Offer-跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路思路一:直接用递归,对于第n个台阶来说,只能从n-1或者n-2的台阶跳上来,所以F(n) = F(n-1) + F(n-2)F(n)=F(n−1)+F(n−2),f(1)=1f(1)=1,f(2)=2f(2)=2思路二:用迭代的方法,用两个变量记录f(n-1)f(n−1)和...原创 2018-03-22 13:35:00 · 108 阅读 · 0 评论