![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
良殿世无双
这个作者很懒,什么都没留下…
展开
-
剑指offer-数组中只出现一次的数字(两个)(位运算)
1、异或运算法制:相同则取0,不同则取1一个数与0做异或,则还是这个数本身;2、题目3、题解class Solution { public int[] singleNumbers(int[] nums) { int x=0,y=0,n1=0,m=1; //第一遍遍历异或得到所求x,y的异或值 for(int num:nums){ n1= n1^num; } //m循环移位做与,得到第一个为1的二进制位原创 2021-09-13 10:22:03 · 163 阅读 · 0 评论 -
合并两个有序数组
class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int end = m+n-1; int p1 = m-1; int p2 = n-1; int temp; while(end >= 0){ if(p1 == -1) temp = nums2[p2--]; else if(p2==-1) .原创 2021-05-24 22:12:11 · 74 阅读 · 0 评论 -
剑指offer之顺时针打印矩阵
题目思路及代码import java.util.ArrayList;public class Solution { public ArrayList<Integer> printMatrix(int [][] matrix) { ArrayList <Integer> result = new ArrayList<>(); if(matrix == null || matrix.length == 0|| matri原创 2021-04-01 22:22:18 · 51 阅读 · 0 评论 -
剑指offer之矩阵中的路径(递归,DFS,回溯)
题目思路及代码DFS和回溯入手点:1、主方法找到递归开始的第一个点,调用递归方法;2、递归方法中首先进行边界条件和是否能符合题目要求(本题中为是否与字符串中的第k个字符相同),若均满足,则该位置可访问,改变该位置的标记;3、判断是否到达结束条件,若否则按照规定的搜索方法进行下一个位置的查找;4、若按照规定的查找方法搜索完均未满足题目要求,则重新改变该位置标记,进行回溯。import java.util.*;public class Solution { /**原创 2021-04-01 21:39:12 · 74 阅读 · 0 评论 -
剑指offer之机器人的运动范围(递归,DFS)
题目思路及代码public class Solution { public int movingCount(int threshold, int rows, int cols) { if(threshold <0 || rows < 1 ||cols < 1) return 0; boolean[][] flag = new boolean[rows][cols]; //默认false return search (thre原创 2021-04-01 20:10:40 · 81 阅读 · 0 评论 -
剑指offer之丑数(动态规划)
题目思路及代码直接对丑数进行存储。将丑数数组中的数依次乘以2,3,5,将最小的数存入数组,并将乘 2 3 5的下标+1,后续最小的丑数应该从2 3 5对应下标的丑数乘2 3 5中产生。import java.lang.Math;public class Solution { public int GetUglyNumber_Solution(int index) { if( index <=0) return 0; int[] uglyNum原创 2021-04-01 12:00:41 · 77 阅读 · 0 评论 -
剑指offer之翻转字符串(null,空串,全是空格的非空串)
1、题目思路及代码先根据空格对字符串进行分割,然后对分割后的字符数组进行逆序拼接;注意空格的加法。特殊情况:字符串为空 String s;此时s为null,不具备任何属性,包括length;字符串为空 ,String s = "";长度为0;字符串全为空格,有几个空格长度就是多少。public class Solution { public String ReverseSentence(String str) { if (str == nu.原创 2021-03-31 00:10:18 · 83 阅读 · 0 评论 -
剑指offer之把字符串转换成整数
题目思路及代码1、1、不考虑正负号及特殊情况时:采用for循环从左到右依次乘10累加,并将结果依次乘10累加(不能根据字符串长度进行按位求幂累加,因为字符串长度可能会超过int类型的最大位数,求得过程本身就已越界)2、当字符串首位字符为'-'时,相减;为'+'或者首字母为数字时直接累加;3、当字符串首字符为除2中情况的其他字符时,则不为数字,返回0;判断依据:ASCII码中48~57为0到9十个阿拉伯数字。所以,当字符1要转换成数字1时,需要将字符1转换成ASCII码翻译出的原创 2021-03-30 11:17:37 · 115 阅读 · 0 评论 -
剑指offer之正则表达式匹配
题目思路代码import java.util.*;class Solution { public boolean isMatch(String A, String B) { int n = A.length(); int m = B.length(); boolean[][] f = new boolean[n + 1][m + 1]; for (int i = 0; i <= n; i++) { .原创 2021-03-30 09:24:14 · 190 阅读 · 0 评论 -
剑指offer之把数组排成最小的数
题目思路及代码1、字典序全排列import java.util.ArrayList;import java.util.*;import java.util.Arrays;public class Solution { public String PrintMinNumber(int [] numbers) { // method 1全排列解法 Arrays.sort(numbers); //String result原创 2021-03-29 11:47:37 · 73 阅读 · 0 评论 -
剑指offer之字符串的全排列
import java.util.ArrayList;import java.util.Collections;import java.util.Arrays;public class Solution { public ArrayList<String> Permutation(String str) { ArrayList <String> result = new ArrayList<>(); if(str.length.原创 2021-03-29 09:58:40 · 78 阅读 · 0 评论 -
剑指offer之矩阵中的路径(深度优先搜索:DFS,递归)
题目思路代码import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param matrix string字符串 * @param rows int整型 * @param cols int整型 * @param str string字符串 * @retur..原创 2021-03-25 17:02:24 · 122 阅读 · 0 评论 -
包含min函数的栈(栈)
题目定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。思路辅助栈,设置数据栈和最小值栈,数据栈按普通栈的方式进行出栈入栈,最小值栈依次存入当前的最小值,栈顶元素永远是当前最小值。代码import java.util.Stack;public class Solution { Stack <Integer> data = new Stack <>(); Stack <Integer&g原创 2021-03-22 15:44:26 · 69 阅读 · 0 评论 -
剑指offer之 替换空格
问题请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解法1import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @return string字符串原创 2021-03-21 21:19:52 · 63 阅读 · 0 评论 -
剑指offer之二维数组中的查找(二维数组)
问题在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路及代码1、暴力解法双层遍历//定义一个整型数组:3行4列int a[][] = new int[3][4];//获取行数---3行int lenY = a.length;//获取列数---4列int lenX = a[0].length;//二维数组可以看做是袁术为一维数...原创 2021-03-19 22:55:19 · 111 阅读 · 0 评论 -
剑指offer之链表的倒数第k个节点(双指针)
题目输入一个链表,输出该链表中倒数第k个结点。思路链表的倒数第k个节点+正数的长度等于链表总长度,因此,若让一个指针先走k步,另一个指针在此时与上一个节点同时开始走,则后起步的指针就走了从正数的长度也就是倒数第k个节点位置。代码import java.util.*;/* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { *原创 2021-03-19 22:27:08 · 106 阅读 · 0 评论 -
剑指offer之表示数值的字符串(正则表达式)
目录题目:思路:代码题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。思路:正则表达式^ 匹配输入字符串的开始位置代码import java.util.regex.Pattern;public class Solution { .原创 2021-03-19 22:06:12 · 96 阅读 · 0 评论 -
剑指offer之最小的K个数(堆、排序、优先队列)
问题给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组。思路采用最大堆对数组进行存储,当堆中的长度大于k时,进行出堆,将剩余k个数据按要求返回。代码import java.util.ArrayList;import java.util.PriorityQueue;import java.util.Comparator;public class Solution原创 2021-03-17 21:18:34 · 83 阅读 · 0 评论 -
剑指offer之数据流中的中位数(数组、排序、堆)
问题描述:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。解法1:无序数组+集合自带的排序方法采用无序数组进行插入存储,然后利用集合自带的排序方法进行排序,最后求得结果。import java.util.*;public class Solution {原创 2021-03-17 20:06:30 · 128 阅读 · 0 评论 -
Java的方法重载和重写及java注释
方法重载和方法重写重载:如果多个方法有相同的名字、不同的参数,便出现了重载。编译器根据方法根据参数类型与特定方法调用中所使用的值的类型进行匹配,找出正确的方法。要完整地描述一个方法,需要指定方法名及参数类型,这叫做方法的签名。返回类型不是方法签名的一部分,也就是说,不能有两个名字相同、参数类型相同却又不同返回类型的方法。重写:java注释块注释/** ..... */行注释 //...原创 2021-03-17 20:05:36 · 943 阅读 · 0 评论 -
剑指offer之重建二叉树(Arrays)(二叉树的遍历)
问题输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路1、根据前序遍历找到根节点;2、中序遍历中,根节点前的结点均为根节点的左子树结点且顺序为左子树中序遍历的结果;根节点后的结点均为根节点的右子树且为右子树中序遍历的结果;3、根据中序遍历确定左子树结点长度left,右子树结点长度right。则前序原创 2021-03-15 22:50:54 · 69 阅读 · 0 评论 -
剑指offer之扑克牌顺子(set)
1、题目LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去原创 2021-03-14 23:45:49 · 140 阅读 · 0 评论 -
剑指offer之和为S的连续整数序列
题目小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck返回值描述:输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序思路及代码import java.util.Array原创 2021-03-09 22:31:35 · 71 阅读 · 0 评论 -
剑指offer之和为s的两个数字
题目输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。对应每个测试案例,输出两个数,小的先输出。思路数组为递增数组,可以采用双指针,第一个指针指向数组的第一个数字,第二个指针指向数组的最后一个数字,当两数相加大于S时,则最后一个指针前移;小于S时,则第一个指针后移;当两数之和等于S时,则两数乘积必定最小(和一定则差的绝对值越大乘积越小),将这两个数字直接输出。也可以将符合条件的乘积和数组保存下来,再进行判断。原创 2021-03-09 21:44:11 · 75 阅读 · 0 评论 -
剑指offer之二叉树的下一个结点(中序遍历)
中序遍历1、中序遍历根节点的左子树;2、访问根节点;3、中序遍历根节点的右子树;中序遍历结果:dbheiafcg问题描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路及代码三种情况:1、该结点有右子树,则下一结点为右子树中序遍历的最左节点;2、该结点无左子树&&父节点不为空{caseA:该节点为父节点的左节点,则下一节点为父节点;caseB:该结点为原创 2021-03-09 15:30:22 · 97 阅读 · 0 评论 -
剑指offer之 栈的压入、弹出序列
问题:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的思路(辅助栈+双层循环)将压栈序列依次压入辅助栈temp,每次压栈时判断与出栈序列的第一个元素(记为目标元素)是否相同,若相同,则辅助栈出栈该元素,标记元素后移继续判断,重复压栈判断过程。若最后原创 2021-03-09 12:41:37 · 64 阅读 · 0 评论 -
剑指offer之数字在升序数组中出现的次数(二分)
public class Solution { public int GetNumberOfK(int [] array , int k) { if(array.length==0||k<array[0]||k>array[array.length-1]) return 0; //查找上界,最后一个k int low , high = 0; int first = 0,size = array.lengt原创 2021-03-09 00:01:05 · 86 阅读 · 0 评论 -
剑指offer之孩子们的游戏(圆圈中最后剩下的数)约瑟夫环问题
思路问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。我们知道第一个人(编号一定是(m-1)mod n) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m mod n的人开始):k k+1 k+2 ... n-2,n-1,0,1,2,... k-2并且从k开始报0。我们把他们的编号做一下转换:k --> 0k+1 --> 1k+2 --> 2......k-2 -原创 2021-03-08 00:02:10 · 129 阅读 · 0 评论 -
剑指offer之把二叉树打印成多行(队列)
思路:import java.util.*;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { ArrayList<ArrayList<Integer&原创 2021-03-07 17:27:53 · 66 阅读 · 1 评论 -
剑指offer之反转链表
/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode ReverseList(ListNode head) { //空表或链表长度为1 if(head == null || head.next...原创 2021-03-06 20:19:03 · 55 阅读 · 0 评论 -
剑指offer之字符流中第一个不重复的字符(队列常用方法)
1、思路因此,通过申请长度为128的数组即可完成对所有字符及出现次数的存储。存在强制类型转换(char---int)先出现的不重复字符先入队,然后通过int数组中对应的值判断是否是第一次出现,只存储不重复的字符。public class Solution { int[] charCnt = new int[128]; Queue<Character> queue = new LinkedList<Character>(); //Insert原创 2021-03-05 22:44:39 · 157 阅读 · 0 评论 -
剑指offer之左旋转字符串(+字符串常见操作)
知识点: substringpublic String substring(int beginIndex)返回从起始位置(beginIndex)至字符串末尾的字符串;public String substring(int beginIndex, int endIndex)返回从起始位置(beginIndex)到目标位置(endIndex)之间的字符串,但不包含目标位置(endIndex)的字符public class subs { public static void main(Strin原创 2021-03-03 23:01:19 · 95 阅读 · 1 评论 -
剑指offer之数值的整数次方
public class Solution { public double Power(double base, int exponent) { boolean inCheck = true; double result = 0.0; if(equal(base,0.0)&& exponent< 0){ inCheck = false; return 0.0; }原创 2021-02-27 22:43:34 · 49 阅读 · 0 评论 -
剑指offer之环的入口结点(双指针或Set)
思路快指针fast和慢指针slow同时从头结点出发,快指针一次走两步,慢指针一次走一步,假设第一次相遇的点为C.相遇时,慢指针保持不变,快指针重新从头结点出发,每次走一步,再次相遇时,则为环的入口结点B。慢指针进入环的第一圈就会和快指针相遇(假设慢指针第一次到达入口结点B时,快指针一定已经在环内,假设快指针此时距离B点距离为L,L一定小于环的长度,因此当慢指针进入环走了L时,快指针一定能走2L追上慢指针。)假设环的长度为r,CBD的长度为P,则当第一次相遇时有2(X+Y)= X+nr+Y,即X+原创 2021-02-26 23:15:59 · 106 阅读 · 0 评论 -
剑指offer值数组中只出现一次的两个数字
HashMap进行保存和计数;HashSet对只出现一次的数字进行存储(Set集合的不可重复性)。采用iterator进行遍历Set集合并输出。import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整型一维数组 * @return int整型一维数组 */原创 2021-02-26 21:12:47 · 83 阅读 · 0 评论 -
剑指offer 之数组中重复的数字
import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param numbers int整型一维数组 * @return int整型 */ public int duplicate (int[] numbers) { // write code here Ha.原创 2021-02-26 19:07:05 · 149 阅读 · 0 评论 -
剑指offer之两个链表的第一个公共结点
/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2){ int l1= Nlength(pHead1);原创 2021-02-26 14:38:59 · 43 阅读 · 0 评论 -
剑指offer之 二进制中1的个数(位运算)
一、题目描述二、思路1、将n依次右移,与1做与运算n为负时容易陷入死循环;2、n不动,将1依次左移,循环次数等于整数二进制的位数;3、将该数减1后与原数进行与运算,会将最右边的1变为0,将进行与运算后的数记赋值给n,则原n有几个0就进行几次循环。三、代码public class Solution { public int NumberOf1(int n) { int count = 0; while(n != 0){ count ++原创 2021-02-24 21:39:06 · 65 阅读 · 0 评论 -
剑指offer之矩形覆盖(递归)
思路转载:矩形覆盖代码(自下向上)(原算法复杂度比较高)注意当taeget = 0的时候public class Solution { public int rectCover(int target) { if ( target >=0 && target<= 2) return target; int a = 1, b =2,sum =a+b; for(int i = 3;i<= tar原创 2021-02-23 22:10:31 · 87 阅读 · 0 评论 -
剑指offer之 跳台阶(递归)
public class Solution { public int JumpFloor(int target) { if (target>=1&&target<=2) { return target; }else{ return JumpFloor(target-1)+JumpFloor(target-2); } }}public class Solution { public int J.原创 2021-02-22 23:43:29 · 89 阅读 · 0 评论