剑指offer
啊这就离谱
这个作者很懒,什么都没留下…
展开
-
第一个只出现一次的字符
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)分析:因为字母 A-Z 的ASCII码是65-90,a-z的ASCII码是96-122,使用一个长度为58(122-65+1)的数组,第一次遍历时给数组赋值,第二次遍历返回数值为1的数所在的位置。public class Solution { public int FirstNotRepeatingChar(Strin原创 2020-07-27 21:52:14 · 118 阅读 · 0 评论 -
时间复杂度和空间复杂度
时间复杂度时间复杂度O:代表随次数增长所用时间增长的趋势(渐进时间复杂度T(n)=O(f(n)),f(n)代表执行总次数,O代表正比例关系)例如常见的循环:for(i=0;i<n;i++){ x++;}进入时执行一次i,此后每一次循环执行x<n判断、x++、i++,总共执行3n+1次,时间复杂度为O(3n+1),考虑n趋近无穷,O(3n+1)=O(n)然后是常见的二维数组循环:for(i=0;i<n;i++){ for(j=0;j<n;j++){ a[i][原创 2020-07-26 22:48:02 · 114 阅读 · 0 评论 -
数字在排序数组中出现的次数
统计一个数字在排序数组中出现的次数。有序数组——二分法考虑到递增和递减两种情况,用一个 flag 来表示,总结起来两个指针的移动有四种情况:k<array[mid]&&flag==true(即递增)==> index1=mid-1;k<array[mid]&&flag==false(递减)==> index2=mid+1;k>array[mid]&&flag==true(递增)==> index2=mid+1;原创 2020-07-24 22:45:00 · 111 阅读 · 0 评论 -
平衡二叉树
输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树。完全遍历:public class Solution { public boolean IsBalanced_Solution(TreeNode root) { if(root==null) return true; if(!(Math.abs(getDepth(root.left,0)-getDepth(root.right,0))<=1))原创 2020-07-23 21:13:38 · 81 阅读 · 0 评论 -
正则表达式匹配
请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配分析:当模式中的第二个字符不是“*”时:1、如果字符串第一个字符和模式中的第一个字符相匹配,那么字符串和模式都后移一个字符,然后匹配剩余的。2、如果 字符串第一个字符和模式中的第一个字符相不匹配,直接返回false。原创 2020-07-17 22:32:28 · 181 阅读 · 0 评论 -
剪绳子
public class Solution { public int cutRope(int t) { if(t==2||t==3) return t-1; else if(t%3==0) return (int) (Math.pow(3,t/3)); else if(t%3==1) return (int) (Math.pow(3,(t-4)/3)*4); else .原创 2020-07-09 22:15:38 · 93 阅读 · 0 评论 -
复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)查了一下,深度拷贝是指内存地址不同,也就是要new对象出来。平时做节点的赋值都是浅拷贝。深度拷贝两节点之间互不影响,浅拷贝即使改变复制品原节点也会被改变。思路:将拷贝出来的节点就插入原节点之后,便于给random赋值,最后拆分两链表public class Soluti原创 2020-07-06 22:19:56 · 82 阅读 · 0 评论 -
不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:转化为二进制中按位的加、与操作。两数之和=不计算进位的加(按位加)+未计算的进位(按位与)这个式子中的“+”仍转化为按位的加和与,一直计算到需要进位的部分为零两数之和=不计算进位的加(按位加)+未计算的进位(按位与)=不计算进位的加(数2)(按位加)+未计算的进位(数2)(按位与)=不计算进位的加(数3)(按位加)+未计算的进位(数3)(按位与)=……=不计算进位的加(数n)(按位加)^未计算的进位(数n)(原创 2020-06-10 21:34:25 · 91 阅读 · 0 评论 -
连续子数组的最大和
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)遍历方法public class Solution { pu原创 2020-06-03 09:41:19 · 79 阅读 · 0 评论 -
*二叉树中和为某一值的路径
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。这题有点坑:首先读题要注意是从根节点出发到叶节点。其次,用递归时,要注意由于传入的集合a是对象,每一层的递归都会更改它的值!而不像target(基本数据类型)在每一层中都有一个值。因此在左右都递归回来后需要移除本结点。再其次,由于存入总集合arr的a实际只是一个地址,而a又被不断更改,会造成arr被间接更改。因此在添加集合到arr时,可以新建一个集合并原创 2020-05-31 21:04:55 · 108 阅读 · 0 评论 -
树的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)爱上递归的我,这波却并不简洁:import java.util.ArrayList;/* * 思路:如果B是A的子树,首先满足B的值在A的结点中。 * 因此,先用一个ArrayList<TreeNode> arr将与B的值相等的A中结点装起来 * 再用一个函数遍历B树,同时检测从arr出发的子树是否和B相同*/ public class Solution { public bool原创 2020-05-27 20:46:28 · 125 阅读 · 0 评论 -
对称的二叉树
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:用两个结点分别代表二叉树对应位置的结点,那么不满足对称条件的情况为:1.两结点一个存在一个不存在2.两结点都存在,但值不相等排除不满足的情况后,boolean默认为true,继续递归public class Solution { boolean isSymmetrical(TreeNode pRoot) { TreeNode lnode=pRoot原创 2020-05-25 21:58:50 · 172 阅读 · 0 评论 -
序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过自己的函数来解原创 2020-05-24 23:23:51 · 198 阅读 · 0 评论 -
数据流的中位数
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。import java.util.*;public class Solution { ArrayList<Integer> list=new ArrayList<Integer>();原创 2020-05-09 21:10:32 · 96 阅读 · 0 评论 -
二叉树的下一个结点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。中序遍历的特点为:左根右分三种情况:该结点右结点不为空,是一个小树的根结点,下一个结点为右子树最左的结点该结点右结点为空,是其父结点的左子树,下一个结点为父结点该结点右结点为空,是其父结点的右子树,下一个结点为这一丛子树的根结点的父结点/*public class TreeLinkNode { int val; TreeLinkNode le原创 2020-05-09 20:33:17 · 134 阅读 · 0 评论 -
重建二叉树
这题给跪了…答案都看了老大半天递归解法:前序遍历数组的第一个数是根节点在中序遍历数组中寻找到根节点,根节点左侧是左子树,右侧是右子树左右子树都可以又看成独立的树,递归进行上述过程/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } *原创 2020-05-09 11:08:55 · 119 阅读 · 0 评论 -
二叉搜索树的第k个结点
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路一:从大到小存入栈中,取出时就是从小到大(我)/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; publ...原创 2020-05-06 21:31:26 · 169 阅读 · 0 评论 -
删除链表中重复的节点
题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5方法一:pre从虚节点开始,永远处在非重复节点的位置上,连接非重复节点。头结点head向后搜索。/* public class ListNode { int v...原创 2020-04-25 22:46:04 · 118 阅读 · 0 评论 -
合并两个排序的链表
题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/import java.util.*;publi...原创 2020-04-24 22:42:31 · 138 阅读 · 1 评论 -
从尾到头打印链表
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* }**/imp...原创 2020-04-24 21:14:04 · 115 阅读 · 0 评论