
剑指offer
二刷进行中
比天空更远
whyJava!我爱Java!
展开
-
机器人的运动范围
public class Solution { public int movingCount(int threshold, int rows, int cols) { boolean[][] visited = new boolean[rows][cols]; return countingSteps(threshold,rows,cols,0,0,vi...原创 2019-01-25 14:14:41 · 172 阅读 · 0 评论 -
矩阵中的路径
public class Solution { public boolean hasPath(char[] matrix, int rows, int cols, char[] str) { int[] flag = new int[matrix.length]; for(int i = 0; i < rows; i ++){ ...原创 2019-01-25 14:14:22 · 167 阅读 · 0 评论 -
滑动窗口的最大值
暴力法: import java.util.ArrayList;import java.util.Collections;public class Solution { public ArrayList<Integer> maxInWindows(int [] num, int size) { if(num==null||size<...原创 2019-01-24 15:00:23 · 283 阅读 · 0 评论 -
数据流中的中位数
对于海量数据以及流的数据,要考虑到使用最大堆与最小堆来管理。 [最大堆 | 左边最大 leftMax] 右边最小rightMin | 最小堆] (最大堆中的数据始终要保持小于最小堆中的数据)当数据总数为偶数时,新加入的数据要加入最小堆。但在加入最小堆之前先进入最大堆进行筛选,把最大堆中的最大数据替换出来加入最小堆。奇数时反之。数据流处理完毕后,最大堆中的...原创 2019-01-24 11:42:07 · 216 阅读 · 0 评论 -
二叉搜索树的第k个结点
二叉树算法题中涉及到排序,首先想到中序遍历二叉树import java.util.*;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val;...原创 2019-01-23 11:50:25 · 131 阅读 · 0 评论 -
序列化二叉树
迭代法 public class Solution { public int index = -1; //序列化二叉树 String Serialize(TreeNode root) { StringBuffer s = new StringBuffer(); if(root == null){ s.appe...原创 2019-01-23 10:31:41 · 176 阅读 · 0 评论 -
把二叉树打印成多行
利用层次遍历的算法,设置变量count与last,用count来保存当前层已经访问的结点数,last用来保存当前层的最大结点数。当count=last时,表示该层访问结束。 import java.util.*;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode rig...原创 2019-01-22 17:25:15 · 180 阅读 · 0 评论 -
按之字形顺序打印二叉树
import java.util.*;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public cl...原创 2019-01-22 11:48:12 · 164 阅读 · 0 评论 -
对称的二叉树
第一种方法: 利用两个栈来分别保存左右子树,把需要比较的两个节点压进栈,再依次比较。左边push顺序为左节点-->右节点,右边push顺序为右节点-->左节点import java.util.*;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode rig...原创 2019-01-22 10:27:44 · 114 阅读 · 0 评论 -
二叉树的下一个结点
思路:(1) 若该节点存在右子树:则下一个节点为右子树最左子节点(如图节点 B )(2) 若该节点不存在右子树:这时分两种情况:2.1 该节点为父节点的左子节点,则下一个节点为其父节点(如图节点 D )2.2 该节点为父节点的右子节点,则沿着父节点向上遍历,直到找到一个节点的父节点的左子节点为该节点,则该节点的父节点下一个节点(如图节点 I ,沿着父节点一直向上查找找到 B ( ...原创 2019-01-21 15:27:04 · 165 阅读 · 0 评论 -
删除链表中重复的结点
1. 首先添加一个头节点,以方便碰到第一个,第二个节点就相同的情况2.设置 pre ,last 指针, pre指针指向当前确定不重复的那个节点,而last指针相当于工作指针,一直往后面搜索。 public class Solution { public ListNode deleteDuplication(ListNode pHead) { if(pH...原创 2019-01-21 11:47:06 · 203 阅读 · 0 评论 -
链表中环的入口结点
解决该问题需要三步:判断该链表是否有环; 找出环; 找出环的入口结点。遇到环形链表问题时,首先要想双指针法 定义两个指针,一快一慢,快指针一次前进两步,慢指针一次前进一步。如果该链表有环,则快慢指针一定会相遇在环内,此时将其中一个指针回到pHead,一起一步一步前进,那么下次快慢指针相遇时就是链表中环的入口结点。 证明: 设链表无环部分长度为L1(包含...原创 2019-01-21 11:03:48 · 168 阅读 · 0 评论 -
字符流中第一个不重复的字符
看到这种字符对应次数的问题,首先想到使用HashMap来解决 //用哈希表的方式用来统计字符出现的字数,时间复杂度O(n) private void printFirstLetter3(String str) { HashMap<Character, Integer> hashMap = new HashMap<>(); ...原创 2019-01-17 11:34:02 · 207 阅读 · 0 评论 -
表示数值的字符串
普通方法(没研究):链接:https://www.nowcoder.com/questionTerminal/6f8c901d091949a5837e24bb82a731f2来源:牛客网public static boolean isNumeric(char[] str) { int point = 0;//记录小数点个数 int i = 0;//遍历s...原创 2019-01-17 10:30:04 · 129 阅读 · 0 评论 -
正则表达式匹配
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。 1. 当模式第二位是*时 ,且第一位字符匹配,分三种匹配模式: 1. 把*当做0,就是忽略掉前两位X*,继续做匹配; 2. 把*当做是1,字符串后移一位,模式后移两位...原创 2019-01-16 16:37:20 · 4740 阅读 · 3 评论 -
构建乘积数组
B[i]的值可以看成上图矩阵中每行的乘积,由图可看出乘积可分为上三角部分与下三角部分的乘积。下三角用连乘可以很容求得,上三角,从下向上也是连乘。先算下三角中的连乘,先算出B[i]中的一部分,然后倒过来按上三角中的分布规律,把另一部分也乘进去。 import java.util.ArrayList;public class Solution { public int...原创 2019-01-16 10:03:42 · 337 阅读 · 0 评论 -
???把字符串转换成整数
public class Solution{ public int StrToInt(String str) { if (str.equals("") || str.length() == 0) return 0; char[] a = str.toCharArray(); int fuhao = 0; ...原创 2019-01-15 16:48:42 · 184 阅读 · 0 评论 -
数组中重复的数字
三种思路:将数字排序后查找numbers[i] == numbers[i++] 哈希法 由于题目限定“在一个长度为n的数组里的所有数字都在0到n-1的范围内” 剑指offer换位置法 import java.util.*;public class Solution { // Parameters: // numbers: an array...原创 2019-01-15 15:46:20 · 147 阅读 · 0 评论 -
不用加减乘除做加法
不能使用加减乘除,首先想到利用二进制来解决 可以举例帮助理解例如 5 + 7 : 第一步:相加各位的值,不算进位,得到010,二进制每位相加就相当于各位做异或操作,101^111。 第二步:计算进位值,得到1010,相当于各位做与操作得到101,再向左移一位得到1010,(101&111)<<1。 第三步重复上述两步, 各位相加 010^101...原创 2019-01-11 15:55:26 · 119 阅读 · 0 评论 -
求1+2+3+...+n
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 利用Math.pow方法和移位运算 public class Solution { public int Sum_Solution(int n) { //Math.pow方法,(double a, double b)。 ...原创 2019-01-11 15:16:22 · 265 阅读 · 0 评论 -
???圆圈中最后剩下的数(约瑟夫环问题)
public class Solution { public int LastRemaining_Solution(int n, int m) { if(n < 1 || m <1){ return -1; } int[] array = new int[n]; int i= -1, st...原创 2019-01-11 11:23:27 · 174 阅读 · 0 评论 -
扑克牌顺子
排序 计算所有相邻数字间隔总数 计算0的个数 如果2、3相等,就是顺子 如果出现对子,则不是顺子 import java.util.Arrays;public class Solution { public boolean isContinuous(int [] numbers) { int numOfZero ...原创 2019-01-11 10:22:48 · 172 阅读 · 0 评论 -
翻转单词顺序列
先翻转整个句子,然后定义一个blank来控制全局空格变量 依据空格来确定单词的起始和终止位置,以每一个空格为分隔反转句子中每一个单词 最后一个单词因为句尾没有blank来控制,所以单独翻转最后一个单词 public class Solution { public String ReverseSentence(String str) { i...原创 2019-01-10 10:45:29 · 346 阅读 · 0 评论 -
左旋转字符串
左旋转字符串,根据题意可以利用StringBuffer来解决。但是既然提起旋转,就可以先旋转[0,n-1]的字符串,再旋转[n,str.length-1]的字符串,再把整个字符串旋转,就是所求。 public class Solution { public String LeftRotateString(String str,int n) { if(n <...原创 2019-01-10 10:16:34 · 102 阅读 · 0 评论 -
和为S的连续正数序列
使用双指针技术,就是相当于有一个窗口,窗口的左右两边就是两个指针,根据窗口内值之和来确定窗口的位置和宽度。import java.util.ArrayList;public class Solution { public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) { ...原创 2019-01-09 14:46:50 · 125 阅读 · 0 评论 -
和为S的两个数字
由于数组是递增排序,所以采用左右加逼。在数组的头元素和尾元素定义两个指针 如果头尾相加等于S,那么输出 如果头尾相加小于S,由于要输出两个数乘积最小的,所以把头指针向后移动一位,继续执行 如果头尾相加大于S,把尾指针向前移动一位,继续执行 import java.util.ArrayList;public class Solution { public...原创 2019-01-09 11:21:17 · 172 阅读 · 0 评论 -
???数组中只出现一次的数字
链接:https://www.nowcoder.com/questionTerminal/e02fdb54d7524710a7d664d082bb7811来源:牛客网 首先:位运算中异或的性质:两个相同数字异或=0,一个数和0异或还是它本身。 当只有一个数出现一次时,我们把数组中所有的数,依次异或运算,最后剩下的就是落单的数,因为成对儿出现的都抵消了。 依照这个思路,我们来...原创 2019-01-09 10:39:14 · 101 阅读 · 0 评论 -
???平衡二叉树
空树和只有root节点的树是平衡二叉树,然后就是判断root的左右子树深度差是否大于1,如果大于1则这棵树肯定不是平衡二叉树,如果小于1再继续判断左右子树是否为平衡二叉树,如此递归。 public class Solution { public boolean IsBalanced_Solution(TreeNode root) { if (root =...原创 2019-01-09 10:37:50 · 128 阅读 · 0 评论 -
二叉树的深度
public class Solution { public int TreeDepth(TreeNode root) { if(root == null) return 0; int left = TreeDepth(root.left); int right = TreeDepth(root.right); ...原创 2019-01-08 14:53:15 · 112 阅读 · 0 评论 -
数字在排序数组中出现的次数
一看到排序数组,首先要想到用二分法来解决 二分查找,然后向前向后找public class Solution { public int GetNumberOfK(int [] array , int k) { if(array == null || array.length <= 0) return 0; ...原创 2019-01-08 11:52:50 · 182 阅读 · 0 评论 -
两个链表的第一个公共结点
如果两个链表存在公共结点的话,那么从这个节点开始两个链表的元素值都是相同的。如果正常的思路需要遍历两个链表来寻找公共节点,那么时间复杂度为O(mn)。如果从链表尾部开始遍历的话,最后一个相同的元素则是两个链表的第一个公共结点。但是单向链表中只能从头结点开始顺序遍历,所以借助栈的后进先出来解决。这样时间与空间复杂度均为O(m+n)。import java.util.Stack;pub...原创 2019-01-07 14:37:41 · 198 阅读 · 0 评论 -
数组中的逆序对(归并排序思想)
利用归并排序思想这题没有看懂,转来暂存(a) 把长度为4的数组分解成两个长度为2的子数组;(b) 把长度为2的数组分解成两个长度为1的子数组;(c) 把长度为1的子数组 合并、排序并统计逆序对 ;(d) 把长度为2的子数组合并、排序,并统计逆序对;在上图(a)和(b)中,我们先把数组分解成两个长度为2的子数组,再把这两个子数组分别拆成两个长度为1的子数组。接下来一边...原创 2019-01-07 11:02:19 · 5754 阅读 · 19 评论 -
第一个只出现一次的字符
引入hashMap方法,key为字符,value对应出现次数map.containsKey(i):判断key有没有对应的value值,返回的是true或者falsemap.get(i):获取键key为i对应的值map.put(key,value):map传入键值对import java.util.HashMap;public class Solution { HashM...原创 2019-01-04 11:54:39 · 265 阅读 · 0 评论 -
丑数
* 因为丑数的因子只能是丑数 * 丑数的组成成可以分成三种情况:(x和y为大于1的变量) * 3x,5y或3x*5y的倍数个2;可简化为丑数个2 * (。。。。。类推)个3;可简化为丑数个3 * (。。。。。类推)个5;可简化为丑数个5 public class Solution { public int GetUglyNumber_Solution(in...原创 2019-01-04 10:39:08 · 149 阅读 · 0 评论 -
???把数组排成最小的数
解题思路: 先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来。关键就是制定排序规则。 排序规则如下: 若ab > ba 则 a > b, 若ab < ba 则 a < b, 若ab = ba 则 a = b; 解释说明: ...原创 2019-01-03 11:50:05 · 168 阅读 · 0 评论 -
整数中1出现的次数(从1到n整数中1出现的次数)
计算当前位上1出现的次数,它要受到三个方面的影响:当前位上的数字,当前位以下(低位)的数字,当前位以上(高位)的数字: 如果当前位上数字为0,当前位上可能出现1的次数由更高位决定。比如:12013,则可以知道当前位出现1的情况可能是:100~199,1100~1199,2100~2199,,...,11100~11199,一共1200个。可以看出是由更高位数字(12)决...原创 2019-01-03 10:53:00 · 544 阅读 · 0 评论 -
连续子数组的最大和
对于数组array,从array[1]开始逐个进行相加,与最大值比较,并不停地更替最大值。public class Solution { public int FindGreatestSumOfSubArray(int[] array) { if(array.length == 0) return 0; int total ...原创 2019-01-02 11:06:41 · 148 阅读 · 0 评论 -
最小的K个数
先创建一个长度为k的list,然后定义一个getMax方法找出list中最大元素,然后拿k~input.length的元素与这个最大元素比较,小于最大元素则用list.set()方法替换掉。import java.util.ArrayList;public class Solution { public ArrayList<Integer> GetLeastNumbe...原创 2019-01-02 10:32:18 · 119 阅读 · 0 评论 -
数组中出现次数超过一半的数字
使用“打擂”的思想:在遍历数组时保存两个值:一是数组中一个数字,一是次数。 遍历下一个数字时,若它与之前保存的数字相同,则次数加1,否则次数减1;若次数为0,则保存下一个数字,并将次数置为1。 遍历结束后,所保存的数字即为所求。 然后再判断它是否符合条件即可。 public class Solution { public int MoreThanHalfNum_Solut...原创 2018-12-29 15:16:14 · 145 阅读 · 0 评论 -
字符串的排列
这是一道经典的DFS题目,利用回溯的思想找到一个字符数组的全排列,并完成去重与字典序排序操作。先确定第i个字符(从i到最后完成遍历枚举),然后对i+1-N-1个字符递归使用全排列(缩小范围),这便是dfs。 将确定的字符与当前第 i个字符相交换,然后i+1-N-1依然是剩下的字符。 但是要注意,这样做改变了字符数组,必须进行完一次dfs过程后,将数组复原,便于确定i位置其他元素时,不会受...原创 2018-12-29 11:46:01 · 362 阅读 · 0 评论