剑指offer-java实现
Autumn匆
这个作者很懒,什么都没留下…
展开
-
剑指offer-28.字符串的排列
问题:输入一个字符串,打印出该字符串中字符的所有排列,eg,输入字符串abc,则打印出abc、acb、bac、bca、cab、cbaimport java.util.ArrayList;import java.util.Collections;import java.util.HashSet;/*我们把一个字符串看成两部分组成:第一部分为它的第一个字符,第二部分是后面的所有字符...原创 2018-08-26 22:52:12 · 343 阅读 · 0 评论 -
剑指offer--14.调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使所有奇数位于数组的前半部分,所有偶数位于数组的后半部分思路:1.如果不考虑时间复杂度,最简单思路是从头扫描数组,每碰到一个偶数,拿出这个数字,并把位于这个数字后面的所有数字往前移动一位,移动完之后数组的末尾会有一个空位,把该偶数放入这个空位。2.利用排序思想,剑指offer上采用快排思想来写,根据题意,相对位置要保持不变即稳定性,所以...原创 2018-04-28 11:46:41 · 129 阅读 · 0 评论 -
剑指offer--11.数值的整数次方
题目:实现一个函数,求base的exponent次方,不得使用库函数,同时不需要考虑大数问题思路:首先注意要考虑全面 1.当底数为0且指数小于1时,若求倒数则是会出错的,需要进行处理 2.判断底数是否为0,由于base为double,不能直接用==判断其次,除了一般采用逐次相乘,还可以用更高效的方法,即换一种思路思考:求一个整数的32次方,如果已知16次方,则只需在16次方基础上平方,...原创 2018-04-27 21:30:10 · 157 阅读 · 0 评论 -
剑指offer--51.数组中重复的数字
题目:在一个长度为n的数组里所有的数字都是在0到n-1范围,数组中某些数字是重复的,但不知道有介个数字重复了,也不知道每个数字重复了几次,请找出数组中任意一个重复的数字,eg,输入长度为7的数组a={2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3分析:可考虑几种方法1.先把输入的数组排序,从排序的数组中找出重复的数字,即从头到尾扫描排序后的数组,排序长为n的数组的时间复杂度为O(...原创 2018-05-06 11:52:09 · 187 阅读 · 0 评论 -
剑指offer--45.约瑟夫环问题
题目:0,1,,,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字,求出这个圆圈里剩下的最后一个数字。eg,0,1,2,3,4这五个数字,从数字0开始每次删除第3个数字,则删除依次为2,0,4,1,最后剩下的数字是3分析:可用环形链表来模拟圆圈,剑指offer上有讲解利用递归公式,还没看懂,持续更新。。。import java.util.*;public class wr...原创 2018-05-18 16:26:01 · 249 阅读 · 0 评论 -
剑指offer--44.扑克牌顺子
题目:从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的,2--10位数字本身,A为1,J为11,Q为12,K为13,大王、小王可以看成任意数字分析:可以把5张牌看成5个数字组成的数组,先把数组排序,再统计数组中0的个数,最后统计排序之后的数组中相邻数字之间的空缺总数,如果空缺总数小于0的个数,说明是可以填补的,即为trueimport java.util.Arrays;pu...原创 2018-05-18 16:21:39 · 221 阅读 · 0 评论 -
剑指offer--31.连续子数组的最大和
题目:输入一个整型数组,数组里有正数也有负数,数组中一个或者连续的多个整数组成一个子数组,求所有子数组的最大值,要求时间复杂度为O(n)分析:暴力法,枚举所有子数组并求出它们的和,一个长度为n的数组,共有n(n+1)/2个子数组,计算出所有子数组的和,最快也需要O(n^2)时间。分析数组规律发现,若前几步累加的和已经小于0了,则舍弃,累加和从当前数字算起,每次累加和若增大,则更新。动态规划,若用f...原创 2018-05-12 15:29:17 · 142 阅读 · 0 评论 -
剑指offer--30.最小的k个数
题目:输入n个整数,找出其中最小的k个数,eg,输入input={4,5,1,6,2,7,3,8},则最小的四个数是1,2,3,4思路:把输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数,算法时间复杂度为O(nlogn) public static ArrayList<Integer> GetLeastNumbers_Solution(int [] input...原创 2018-05-12 11:28:13 · 213 阅读 · 0 评论 -
剑指offer--25.二叉树中和为某一值的路径
题目:输入一个二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径,从树的根结点开始往下一直到叶结点所经过的结点形成一条路径分析:由于路径是从根结点出发到叶子结点,所以首先要遍历根结点,即前序遍历。规律是,前序遍历访问某个结点,把该结点添加到路径上,并累加该结点的值,如果该结点为叶子结点并且路径中节点的值的和刚好等于输入的整数,则当前路径符合要求。如果当前结点不是叶子结点则继续访问它的子...原创 2018-05-05 22:28:27 · 121 阅读 · 0 评论 -
剑指offer--10.二进制中1的个数
题目:实现一个函数,输入一个整数,输出该数二进制表示中1的个数,eg,9表示为二进制是1001,有2位是1,则输入9,函数返回2分析:思路一:先判断整数二进制表示中最右边一位是不是1,接着把输入的整数右移一位,判断最右边是否为1,这样每次移动一位,直到整个整数变为0为止注意:整数右移一位和把整数除以2在数学上是等价的,但是代码中不能将右移运算换成除以2,因为除法的效率比移位运算要低的多...原创 2018-04-27 15:53:45 · 173 阅读 · 0 评论 -
剑指offer--52.构建乘积数组
题目:给定一个数组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],不能使用除法分析:直观的解法是用连乘n-1个数字得到B[i],时间复杂度为O(n^2)。剑指offer上思路为,B可以用一个矩阵来创建,如图,B[i]为矩阵中第i行所有元素的乘积,不妨设C[i]=A[0]*...原创 2018-05-07 14:02:38 · 260 阅读 · 0 评论 -
剑指offer--46.47.发散思维能力
发散思维能力的特点是思维活动的多向性和变通性,即我们在思考问题时注重运用多思路、多方案、多途径地解决问题,对于同一个问题,可以从不同的方向、侧面和层次,采用探索、转换、迁移、组合和分解等方法,提出多种创新解法。题目一:求1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句分析:使用逻辑与短路特性来实现递归的终止条件public c...原创 2018-05-20 10:40:41 · 273 阅读 · 0 评论 -
剑指offer--59.对称的二叉树
题目:实现一个函数,判断一个二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。分析:前序遍历,先遍历左子结点,再父结点,再右子结点;对称前序遍历,先遍历右子结点,再遍历父结点,再左子结点;通过比较二叉树的前序遍历序列和对称前序遍历序列是否一致,判断其是否是对称的public class wr59isSymmetrical { public boolean isSymmetrica...原创 2018-05-25 09:39:53 · 302 阅读 · 0 评论 -
剑指offer--12.打印1到最大的n位数
题目:输入数字n,按顺序打印出从1到最大的n位十进制,eg,输入3,输出1,2,3^999思考:当输入的n很大的时候,求最大的n位数是不是用整型或者长整型都会溢出?即我们需要考虑大数问题方法一:在字符串上模拟数字加法,首先把字符串中的每一个数字都初始化为'0',然后每一次为字符串表示的数加1,再打印出来方法二:全排列思想,如果在数字前面补0,会发现n位所有十进制数其实就是n个从0到9的...原创 2018-07-19 08:49:02 · 219 阅读 · 0 评论 -
剑指offer--27.二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中节点指针的指向。eg,图所示分析:在二叉搜索树中,左子结点的值总是小于父结点的值,右子结点的值总是大于父结点的值,在转换过程中,原先指向左子结点的指针调整为链表中指向前一个结点的指针,原先指向右子结点的指针调整为链表中指向后一个结点的指针。代码,参考自牛客大神和剑指offer//递归:左子树构成...原创 2018-05-15 20:19:30 · 183 阅读 · 0 评论 -
剑指offer--58.二叉树的下一个结点
题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针分析:若一个结点有右子树,那么它的下一个结点就是它的右子树中最左子结点,即从右子结点出发一直沿着指向左子结点的指针,我们就能找到它的下一个结点。若一个结点没有右子树,且该结点是父结点的左子结点,则它的下一个结点就是它的父结点;若该结点是父结点的右子结点,...原创 2018-05-21 21:00:05 · 175 阅读 · 0 评论 -
剑指offer--57.删除链表中的重复结点
题目:在一个排序的链表中,如何删除重复的结点public class wr57deleteDuplication {// 排序链表,利用指针 public ListNode deleteDuplication(ListNode pHead){ if(pHead==null || pHead.next==null){ return pHead; } ListNode newHe...原创 2018-05-21 20:54:36 · 152 阅读 · 0 评论 -
剑指offer--56.链表中环的入口结点
题目:一个链表中包含环,如何找出环的入口结点?分析:可设置两个指针p1和p2,初始化时都指向链表头结点,设环中有n个结点,p1先在链表上前进n步,接下来两个指针以相同速度在链表上向前移动,直到它们相遇,则相遇点正好是环的入口结点。如何求n?判断链表是否有环时用到了一快一慢指针,若两个指针相遇,则链表中存在环,且相遇点一定在环中,可以从该结点出发,一边继续向前移动一边计数,当再次回到这个结点时,就可...原创 2018-05-21 20:49:24 · 171 阅读 · 0 评论 -
剑指offer--63.二叉搜索树的第k个结点
题目:给定一棵二叉搜索树,请找出其中的第k大结点(题意应该是数字索引的第k个)分析:中序遍历,则数是从小到大排列,第k大结点,即中序结果的k-1索引值import java.util.*;public class wr63KthNode {//遍历所有,输出第k-1个结点 static ArrayList<TreeNode> list=new ArrayList<>(...原创 2018-05-25 15:36:50 · 140 阅读 · 0 评论 -
剑指offer--26.复杂链表的复制
题目:实现一个函数复制一个复杂链表。在复杂链表中,每个结点除了有一个next指针指向下一个结点之外,还有一个random指针指向链表的任意结点或者null分析:有很多思路,剑指offer都有讲解。最优思路是分为三步,第一步,复制原始链表的任意结点N并创建新结点N',再把N'连接到N的后面;第二步,设置复制出来的结点的random指针;第三步,将长链表拆分为两个链表public class wr26...原创 2018-05-14 19:32:58 · 147 阅读 · 0 评论 -
剑指offer--61.之字形打印二叉树
题目:实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印分析:利用两个栈来保存数据,打印某一行结点时,把下一层的子结点保存到相应的栈里,如果当前打印的是奇数层,先保存左子结点再保存右子结点;如果当前打印的是偶数层,先保存右结点,再保存左结点代码:参考牛客大神,比较好理解import java.util.*;publi...原创 2018-05-25 10:24:54 · 159 阅读 · 0 评论 -
剑指offer--60.把二叉树打印为多行
题目:从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行分析:原创 2018-05-25 09:48:16 · 138 阅读 · 0 评论 -
剑指offer--22.栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。eg:push={1,2,3,4,5}是某栈的压入序列,pop={4,5,3,2,1}是它的一个弹出序列分析:建立一个辅助栈,找到规律:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出,如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出...原创 2018-05-05 10:31:05 · 138 阅读 · 0 评论 -
剑指offer--42.翻转单词顺序VS左旋字符串
题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变,为简单起见,标点符号和普通字母一样处理,eg,输入str="I am a student."输出为"student. a am I"分析:第一步翻转句子的所有字符,第二步翻转每个单词的字符题目二:字符串的左旋转操作,是把字符串前面的若干个字符转移到字符串的尾部,eg,输入"abcdefg"和数字2,返回左旋2位得到"cdefg...原创 2018-05-17 22:32:07 · 264 阅读 · 0 评论 -
剑指offer--41.和为s的两个数字和为s的连续正数序列
题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s,如果有多对数字的和等于s,输出任意一对即可分析:在数组中固定一个数字,再依次判断数组中其余n-1个数字与它的和是否为s,时间复杂度为O(n^2)。在数组中选择两个数字,如果它们的和等于s,我们即找到了这两个数字;如果和小于s,选择较小的数字后面的数字;如果和大于s,选择较大的数字后面的数字。时间复杂度O(n)题目...原创 2018-05-17 21:32:53 · 136 阅读 · 0 评论 -
剑指offer--3.二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列按照从上到下递增顺序排序。完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数思路:从一个具体问题入手,通过分析简单具体的例子找出规律。选取数组查找范围内的右上角数字或左下角数字。public class wr3TwoArrayFind {// 从左下角数字开始,m代表行,i代表列 pub...原创 2018-04-26 10:15:31 · 183 阅读 · 0 评论 -
剑指offer--43.n个骰子的点数
题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和是s,输入n,打印出s的所有可能的值出现的概率能力解读:抽象建模,第一步是选择合理的数据结构表述问题,第二步分析模型中的内在规律,并用编程语言表达这种规律分析:n个骰子点数和的最小值为n,最大值为6n,所有点数的排列数为6^n,因此要解决这个问题,可以先统计求出每一个点数出现的次数,然后把每一个点数出现的次数除以6^n,就能求出每个点数出现的概率...原创 2018-05-03 21:06:02 · 207 阅读 · 0 评论 -
剑指offer--20.顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针顺序依次打印出每一个数字分析:可以把矩阵想象为若干个圈,用一个循环来打印矩阵,每次打印矩阵中的一个圈,如左图。设矩阵行rows,列是columns,打印第一圈左上角坐标是(0,0),第二圈左上角坐标是(1,1),以此类推注意到左上角的坐标中行标和列标总是相同的,选择矩阵中左上角(start,start)的一圈作为分析目标发现,循环继续的条件是columns&...原创 2018-05-03 15:41:47 · 553 阅读 · 0 评论 -
剑指offer--21.包含min函数的栈
题目:定义栈的数据结构,在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min,push,pop的时间复杂度都是O(1)分析:1.第一反应可能是每次压栈时,将栈所有元素排序,让最小的元素位于栈顶,这样就能够在O(1)时间得到最小元素,但是这样不能保证最后压栈的元素能先出栈,即栈的后进先出的特性不存在2.可以在栈里面添加一个成员变量,每次压栈时,如果该元素比当前最小的元素还要小,则...原创 2018-05-02 20:24:50 · 143 阅读 · 0 评论 -
剑指offer--19.二叉树的镜像
题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。思路:该题目处于剑指offer第四章—画图让抽象问题形象化,我们可以先采用画图的方式求得其规律。求一棵树镜像的过程:先前序遍历该树的每个结点,如果遍历到的结点有子结点,就交换它的两个子节点,当交换完所有非叶子结点的左右子节点之后,就得到了树的镜像。注意:特殊输入(二叉树的根结点为null)import java.util.*;public...原创 2018-05-02 19:45:14 · 206 阅读 · 0 评论 -
剑指offer--13.在O(1)时间删除链表结点
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点思路:1.最常规做法是从链表的头结点开始,顺序遍历查找要删除的结点,并在链表中删除该结点,时间复杂度为O(n)。2.要删除结点i,先把i的下一个结点j内容复制到i,然后把i的指针指向结点j的下一个结点,此时再删除结点j。对于n-1个非尾结点,可以O(1)时间把下一个结点内容复制覆盖要删除的结点,然后删除下一个结点;对于尾...原创 2018-05-02 17:48:45 · 246 阅读 · 0 评论 -
剑指offer--18.树的子结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构。public class wr18hasSubTree {// 第一步:在树A中查找与根节点的值一样的结点 public boolean HasSubtree(TreeNode root1,TreeNode root2) { boolean result=false;// 当tree1和tree2都不为0的时候才进行比较,否则直接返回...原创 2018-05-02 17:06:47 · 145 阅读 · 0 评论 -
剑指offer--17.合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的思路:递归和非递归两种方法,但是注意特殊输入(空链表)时的处理public class wr17mergeListNode {// 递归 public ListNode Merge(ListNode list1,ListNode list2){ if(list1==null){ return list2...原创 2018-05-02 16:50:28 · 134 阅读 · 0 评论 -
剑指offer--16.反转链表
题目:输入一个链表的头结点,反转该链表并输出反转后链表的头结点思路:之前看程序员面试宝典的时候进行过总结,具体见点击打开链接原创 2018-05-02 16:01:51 · 171 阅读 · 0 评论 -
剑指offer--4.替换空格
题目:请实现一个函数,将一个字符串中的空格替换成“%20”,例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy分析:如果在原来的字符串上做替换,就有可能会覆盖修改在该字符串后面的内存;如果创建新的字符串并在新的字符串上做替换,那么我们可以分配足够多内存。思路:参考《剑指offer》讲解,从字符串后面开始复制和替换,先遍历一次字符串,统计空格总数,然后...原创 2018-04-26 10:35:17 · 218 阅读 · 0 评论 -
剑指offer--5.从尾到头打印链表
题目:输入一个链表的头结点,从尾到头反过来打印每个结点的值 public class wr5ListFromTailToHead {// 栈,每经过一个结点,把该结点放到一个栈中,遍历完链表后,从栈顶输出 public void reversePrint(ListNode head){ if(head==null){ return; } Stack<ListNod...原创 2018-04-26 10:40:50 · 162 阅读 · 0 评论 -
剑指offer--6.重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树public class wr6reConBinaryTree { public TreeNode reConstructBinaryTree(int []pre,int []in){ return reConBTree(pre,0,pre.length-1,in,0,in.length-1); } public Tree...原创 2018-04-26 11:00:50 · 180 阅读 · 0 评论 -
剑指offer--40.数组中只出现一次的数字
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次,找出这两个只出现一次的数字,时间复杂度为O(n),空间复杂度为O(1)题目链接1:一个整型数组里除了一个数字之外,其他数字都出现了两次,找出这个只出现一次的数字分析:异或性质即,任何一个数字异或自己都为0,也就是说,如果我们从头到尾依次异或数组中的每一个数字,那么最终的结果刚好就是那个只出现一次的数字,因为那些成对出现两次的数字全部在异...原创 2018-05-17 20:18:52 · 132 阅读 · 0 评论 -
剑指offer--9.斐波拉契数列
递归是在一个函数的内部调用这个函数自身,而循环是通过设置计算的初始值及终止条件,在一个范围内重复运算。递归代码比较简洁,但也存在缺点,因为函数调用是有时间和空间的消耗的:每一次函数调用,都需要在内存中分配空间以保存参数、返回地址及临时变量,而往栈里压入数据和弹出数据都需要时间,且可能会造成调用栈溢出。题目一:写一个函数,输入n,求斐波拉契数列的第n项,斐波拉契数列定义如下f(n)=0,n=0f...原创 2018-04-26 22:27:36 · 163 阅读 · 0 评论 -
剑指offer--8.旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转,输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素,eg:{3,4,5,1,2}是数组{1,2,3,4,5}的一个旋转,该数组的最小值为1思路:首先想到的是从头到尾遍历数组一次,找出最小元素,时间复杂度为O(n),虽然能过但是不够优化。优化:利用二分查找的思想。用两个指针分别指向数组的第一个元素和最后一个,按照题...原创 2018-04-26 21:30:45 · 190 阅读 · 0 评论