随笔分类 - 博客 剑指Offer解题报告(Java版)
摘要:分析问题 问题只需要找到排序数组中某个数K的个数,由于已经是排序了,K一定是在一堆的,所以我们只需要找到第一个K的index1,然后找到最后一个K的index2就可以了 而寻找K的过程我们一般通过二分法查找,这样时间复杂度能降到logn 解决问题 我们通过二分法寻找k,如果中间的数小于k,那么在前半段找k;如果中间的数大于k,那么在后半段找k,那么如...
阅读全文
摘要:引言 STOI是很常见的一道题,leetcode上也有,字符串转换为数字一般都会有现成的函数去实现这样的功能,但有时候需要我们理解其中的具体实现,因为虽然是个很常见的问题,但实际上需要考虑的问题还是很多的,尤其是corner case的处理,而这类问题一般要考虑两点:一点是符号,另外一点是越界 分析问题 如果字符串前面有空格怎么办,一般来说中间是没有空格的,但是...
阅读全文
摘要:引言 一般这种不能用四则运算的题都只有用位运算来做,目的是加强大家对计算机计算的理解,真是有点扯淡呢 解决问题 首先我们得思考计算机是怎样做加法的呢,比如3加4,如果转换成二进制是0011和0100,加起来是7,也就是0111,相当于是两个二进制的异或运算 但是我们再举一个例子就是4加4,会发现,两个二进制是0100和0100,异或运算的话结果为0000,但是我...
阅读全文
摘要:引言 常见的约瑟夫环问题有用循环链表做的,有用数组做的,这里提供一个用数学公式做的,由此可见,很多计算机的问题如果最终用到数学的知识,时间复杂度会大大的降低 分析问题 首先我们对0到n-1删除第一个数进行分析,第一个被删除的数一定是序号为m-1的数,因为0号数了1,1号数了2,m-1号数了m,那么应该删掉m-1号,设m-1号是第k号,这里这样做是因为后面可以扩展,想扩展为m...
阅读全文
摘要:分析问题 这个题目的关键点在于大小王可以看作任意的数字,那么我们就把这个任意的数字看作0也未尝不可,因为扑克牌中1-15都有数字,所以可以用0代表大小王 这样我们就将问题转换成了从0-15中抽5个数字,看是否连续的问题,由于0可以看作任意数字,所以我们可以用0去补那些空缺的数,比如0,1,3也算是连续的 要记住关键点还是这个任意数字上,考虑一个问题,就是如果这5...
阅读全文
摘要:问题 n个骰子朝上的数之和为s,求s的所有可能以及概率 分析问题 如果是用笨方法,一般人最开始都会想到笨方法,那就是枚举法 举个例子,比如两个骰子,第一个骰子的结果为1,2,3,4,5,6,两个骰子的结果是2,3,4,5,6,7;3,4,5,6,7,8;4,5,6,7,8,9;……7,8,9,10,11,12,共三十六种,用n平方size的数组记录这36个结果 ...
阅读全文
摘要:引言 这种翻转的问题会遇到很多,其实就是一个倒序的问题,对于第一个题只是想翻转单词的顺序,而并不想把整个字符串翻转了,如果完全翻转的话,比如I am a student.中所有字符翻转得到.tneduts a ma I。显然不符合要求,但已经很接近答案了,仔细观察可以发现,我们离最终答案只差一步,...
阅读全文
摘要:引言 第一问题很简单,leetcode上也有相应的题,2Sum问题,leetcode上还有2Sum的进阶版3Sum,只是在这个问题上增加了一层循环而已,另外还有3Sum_Close问题,就是和接近s的三个数,本文将依次介绍2Sum问题,3Sum问题,以及3Sum_close,以及一串连续数问题 对...
阅读全文
摘要:分析问题 任何一个数字异或它自己都等于0,通过这个思想遍历数组,用一个result累计异或操作,如果遇到某一个数两次,必定消除了异或操作,换句话说就是如果我们从头依次异或数组中的每一个数字,那么最终的结果应该是那个只出现一次的数字 要想说的更明白一点不如举个例子 实例 比如int[] arr...
阅读全文
摘要:问题一 引言 在之前我们讲到过如果保存树根节点到叶子节点之间的路径,其中包含了如何判断一个节点是否是叶子节点,而且用栈保存了路径中的节点,只要遍历一下栈即可,然后用一个深度保存所有遍历深度中的最大值 但仔细想想,这种方法是否过于繁琐,我们其实不需要一个完整的路径,为什么要去用一个栈保留路径呢,...
阅读全文
摘要:引言 这个问题一种常想到的方法就是两层循环遍历,外层循环遍历链表A,对A中每个节点,遍历链表B,如果在B中找到,说明这个节点是第一个公共节点,但是这样的方法时间复杂为mn,一般是不允采用的 分析问题 所以我们需要分析更深层次的问题,找到其中的规律,我们如果动手画一下一般的链表图就能够发现两个链表...
阅读全文
摘要:引言 一开始接触到这题还觉得挺有意思的,但后来发现其深层次的含义就是一个归并排序,只是在归并排序的过程中做了一点小动作而已,这也再次证明了很多东西都是万变不离其宗的 本文首先讲了一下归并排序的过程,用了自己比较喜欢的简洁的方式,然后对比归并排序与求逆序对之间的关系,发现需要稍微修改一下合并两个...
阅读全文
摘要:分析问题 首先需要明白路径的概念,路径是从根节点出发,一直到叶子节点,所形成的一条路径 所以我们寻找和为某一值的路径的时候,首先从根节点10出发,前序遍历二叉树,路径为10,5,4,发现和不为22,所以需要从4返回到5,然后再走7,发现和为22,记录下这条路径 然后再返回到5,再返回到10,...
阅读全文
摘要:引言 继续二叉树,这个题考的知识点是二叉树的后续遍历 分析问题 对于一个二叉树的后序遍历序列来说,最后一个数一定是根节点,然后前面的数中,从最开始到第一个大于根节点的数都是左子树中的数,而后面到倒数第二个数应该都是大于根节点的,是右子树,如果后面的数中有小于根节点的,那么说明这个序列不是二叉搜...
阅读全文
摘要:引言 发现二叉树的问题很多都是用递归解决的,除了按照剑指offer书中给的递归方法,自己也用栈的方法去实现了,两种方法其实深层次的思想差不多 分析问题 只要我们前序遍历,或者层次遍历二叉树,如果遇到节点就将左右子树交换,即可,递归基就是节点没有左右子树 解决问题 利用递归方法 这里要注意...
阅读全文
摘要:引言 继续二叉树的狂轰乱炸,这道题很简单,就是一个二叉树的递归问题 分析问题 要判断树B是否为树A的子结构,可以分为两步,第一步找到两棵树中节点相同的根节点R 然后判断A中以R为根节点的子树是否包含树B,比如以下两棵树,我们知道子树B的根节点是8,所以我们在A中从根节点开始找,找8,发现根节...
阅读全文
摘要:引言 自己觉得对二叉树了解的不是很多,所以想专门练习一下这方面的问题,剑指Offer中有一道题是将二叉搜索树转换为双向链表,开始的时候照着书上的思路去做,最后发现问题很多,看来这本书也有很多问题啊,原因是Java和C++还是有很多不同的,特别是对对象的引用方面。自己在红色部分标注出了问题的所在,...
阅读全文
摘要:将当下一个节点的data和nextNode拷贝到当前节点,即完成删除 但不能用deleteNode=deleteNode.nextNode 这样是让指针循环下移 要求当前node不要后移,只要把后面的数据复制过来即可 考虑首节点为空的情况 考虑只有一个节点,删除头节点 考虑有多个节点,删除尾节点,此时需要O(n) 先循环找到deleteN...
阅读全文
摘要:两种解法,一种递归,一种判断该数加1是否最高位进1 第二种较简单 主要两个函数,一个是打印数字,要求判断该数字是否是第一个不为零的数字,然后后面的依次打出即可 第二个函数是对一个数加1判断加1之后的数是否使得最高位进位 初始化长度为n的字符数组,即初始0,对该数实现字符上的加1,如果一直没进位,则打印该数,如果进位,则退出循环 第二种利用递归,全排列...
阅读全文
摘要:注意输入的判断,多写几个if语句判断是否满足输入数据的条件 另外exp为负的时候,输入的base变为1.0/base而不是1/base 所以返回值要设置为double,base也要设为double 另外要自己定义equal,而不能用==,要去判断两个数的差的绝对值是否在一定范围内 package myPower11; public class MyPowe...
阅读全文

浙公网安备 33010602011771号