- 博客(50)
- 收藏
- 关注
原创 剑指offer-二刷
09.用两个栈实现队列力扣错误点:1.栈定义Stack<Integer>A = new LinkedList<>() 是错误的Stack<Integer> a = new Stack<>();或者 LinkedList<Integer> l = new LinkedList<>();思路:添加时直接在A中加,B相当于A的倒序。删除时要考虑三种情况,当B中有元素,直接删;AB都没元素时,要返回-1;剩下的只有A..
2022-03-15 20:59:10 278
原创 剑指offer-正则表达式动态规划
1.请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。题目链接:力扣class Solution { public boolean isMatch(String s, String p) { //dp[i][j]代表添加s的第i-1个
2022-03-11 20:43:33 347
原创 剑指offer-约瑟夫环
1.0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。题目链接:力扣这里是逆推,i起初为2是逆推时最后的结果是2个数,class Solution { public int lastRemaining(int n, int m) {
2022-03-11 18:40:04 7456
原创 剑指offer-数据类型的定义出错
1.数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。题目链接:力扣class Solution { public int findNthDigit(int n) { //找规律题:不断的缩小范围 //根据n先找到该n处于几位数,之后确定哪个数,再确定n位于哪位值 long start
2022-03-11 18:36:51 271
原创 剑指offer-堆-利用堆添加元素时的自动排序
1.如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4]的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。题目链接:力扣.
2022-03-09 17:08:32 91
原创 剑指offer-数位dp求1-n中1出现的次数
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。本题需注意:cur,digit,low,high 的定义,及其赋值时的顺序。题目链接:力扣class Solution { public int countDigitOne(int n) { //本题固定位(十进制),利用固定位循环 //当固定位为0时,计算公式是:高位值*固定位的进制数;
2022-03-09 15:30:34 152
原创 剑指offer-有限状态自动机-先定义状态、再画状态转移图、最后编写代码
解题最重要难点的是根据题意去,发掘出各个状态的定义。1.请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。题目链接:力扣数值(按顺序)可以分成以下几个部分:若干空格 一个小数或者整数 (可选)一个'e'或'E',后面跟着一个整数 若干空格小数(按顺序)可以分成以下几个部分:(可选)一个符号字符('+' 或 '-') 下述格式之一: 至少一位数字,后面跟着一个点 '.' 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字 一个点 ...
2022-03-08 17:59:19 1381
原创 剑指offer-二进制,加运算
1.编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量).)。题目链接:力扣public class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { int res =0; while(n !=0){ res ++; .
2022-03-07 10:54:33 8028
原创 java排序代码总结-快排、归并
1.快速排序快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。public static void quickSort(int[] arr,int left, int right) { int l = left; //左下标 int r = right; //右下标,这里起
2022-03-04 22:24:01 518
原创 剑指offer-矩阵问题
1.输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]题目链接:力扣题目关键:确定跳出循环时的是否有等号;class Solution { public int[] spiralOrder(int[][] matrix) { //没有处理特殊情况 if(matrix.length ==0) return new .
2022-03-03 23:00:35 119
原创 剑指offer-回溯-深度优先搜索+剪枝
此类1.String实例化的不同方式方式一:通过字面量定义的方式,数据储存在方法区的字符常量池中方式二:通过new + 构造器的方式,此时遍历是指的堆空间的地址值常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。只要其中一个是变量,结果就在堆中。如果拼接的结果调用intern()方法,返回值就在常量池中2.StringBuffer\StingBuilder是可变长的字符串...
2022-03-03 22:18:21 373
原创 Java基础-高级
1.程序(programm)、进程(process)、线程(thread)程序:是为完成特定任务,用某种语言编写的一组的指令的集合。指一段静态的代码。进程:程序的一次执行过程,或是正在运行的一个程序。线程:进程可以进一步细化成线程,是一个程序内部的一条执行路径。(例如360可以同时进行木马查杀和电脑清理,这两个是360程序运行的两个线程。 线程作为调度和执行的单位,每个线程拥独立的运行栈和程序计数器(pc),一个进程共享方法区和堆。2.并行与并发并行:多个CPU同时执行多个任务。比如:多
2022-03-01 10:31:56 421
原创 剑指offer-动态规划
动态规划(Dynamic Programming),简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每个状态是由上一个状态推导出来的,这一点区别于贪心,贪心没有状态推导,而是从局部直接选最优的。动态规划5步:...
2022-02-28 22:22:23 321
原创 Java面试常见基础问题
1.属性和局部变量的区别1.相同点: 1.1 定义变量的格式:数据类型 变量名 = 变量值 1.2 先声明,后使用 1.3 变量都其对应的作用域2.不同点: 2.1 在类中声明的位置的不同 属性:直接定义在类的一对{}内 局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量 2.2 关于权限修饰符的不同 ...
2022-02-28 14:58:55 91
原创 捋顺java面试重点知识
目录一、Java开发环境--一次编译,随处运行1.JDK,JRE,JVM的关系2.Java和C++的区别?二、基本语法一、Java开发环境--一次编译,随处运行1.JDK,JRE,JVM的关系JDK能够创建和编译程序。JRE 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的一些基础构件。但是,它不能用于创建新程序。在 Java 中,JVM 可以理解的代码就叫做
2022-02-28 10:37:04 209
原创 剑指offer -简单算法
1.考察边界的确定写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0,F(1)= 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。题目链接:力扣class Solution { ...
2022-02-24 17:30:02 156
原创 剑指offer-字符串
1.请实现一个函数,把字符串 s 中的每个空格替换成"%20"。题目链接:力扣考验可变字符串类,StringBuilder的使用class Solution { public String replaceSpace(String s) { StringBuilder res = new StringBuilder(); for(char chars : s.toCharArray()){ if(chars == ' ') res.
2022-02-24 17:28:13 127
原创 剑指offer-数组\矩阵
1.找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。重点是:使用set集合,set中不能储存重复的值题目链接:力扣class Solution { public int findRepeatNumber(int[] nums) { //使用set集合,set中不能储存重复的值 Set<In
2022-02-24 17:14:21 480
原创 剑指offer-栈队列堆
栈-后进先出,队列先进先出1.输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。题目链接:力扣/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public int[] reverse
2022-02-23 20:35:10 78
原创 剑指offer-搜索二叉树
搜索二叉树定义:左子树中所有节点的值 <根节点的值;右子树中所有节点的值 > 根节点的值;其左、右子树也分别为二叉搜索树。1.输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。题目链接:力扣重点:左右子树的划分;class Solution { public boolean verifyPostorder(int[] postorder) { re..
2022-02-22 16:11:54 148
原创 剑指offer-二叉树层序遍历
1.从上到下打印二叉树的每个节点,同一层的节点按照从左到右的顺序打印题目链接:力扣算法流程:1)特例处理:当树的根节点为空,则直接返回空列表 [ ] ;2) 初始化:打印结果列表 res = [ ],包含根节点的队列 queue = [root];3)BFS循环:当队列queue为空时跳出; a.出队:队首元素出队,记为node; b.打印:将node.val添加至列表tmp尾部; c.添加子节点:若node 的左(右)子节点不为空,...
2022-02-21 20:25:46 450
原创 递归三要素
1.确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数,并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。2.确定终止条件:写完了递归算法,运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。3.确定单层递归的逻辑:确定每一层递归需要处理的信息。在这里就会重发调用自己来实现递归的过程。...
2022-02-21 11:58:58 361
原创 剑指offer-二叉树递归
1.重建二叉树:根据前序和中序的遍历结果,重构建二叉树并返回其根节点题目链接:力扣方法:递归对于任意树,前序遍历的形式,根节点是前序遍历的第一个节点【根节点,【左子树前序遍历结果】,【右子树的前序遍历结果】】中序遍历的形式【【左子树的中序遍历结果】,根节点,【右子树的中序遍历结果】】只要我们在中序遍历中定位到根节点,那么我们就可以分别知道左子树和右子树中的节点数目。由于同一颗子树的前序遍历和中序遍历的长度显然是相同的,因此我们就可以对应到前序遍历的结果中,对上述形式中的所有左右括
2022-02-17 20:24:41 416
原创 剑指offer-链表
一、链表1.描述输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。如输入{1,2,3}的链表如下图:返回一个数组为[3,2,1]0 <= 链表长度 <= 10000/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = va
2022-02-16 20:31:37 284
原创 四数之和:利用一个HashMap求两数之和,再求其余两数之和时直接判断是否相加为确定值
题目:给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:0 <= i, j, k, l < nnums1[i] + nums2[j] + nums3[k] + nums4[l] == 0题目链接:力扣思路:一采用分为两组,HashMap 存一组,另一组和 HashMap 进行比对。这样的话情况就可以分为三种:HashMap 存一个数组,如...
2022-02-16 17:23:48 239
原创 快乐数:最后值变为1or进入圈中继续循环
题目:编写一个算法来判断一个数 n 是不是快乐数。「快乐数」 定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结果为1,那么这个数就是快乐数。如果 n 是 快乐数 就返回 true ;不是,则返回 false 。题目链接:力扣思路:题目关键是发现快乐数变化规律,题目告诉了两种情况不可能无限变大,因为都是数的每一位的平方,比不上一个最高位的值大1)将该数替换成每个.
2022-02-16 15:37:16 221
原创 Map两个数组的交集包括重复的部分
题目:350.两个数组的交集2给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。力扣题目链接:力扣基础:创建map集合:Map<Integer, Integer> map = new HashMap<Integer, Integer>();map集合函数:获得对应key值的value-----
2022-02-16 12:20:25 730
原创 HashSet:提取两个数组的重复的值
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。题目:力扣基础:集合基本函数和属性class Solution { //利用set的不可重复性 public int[] intersection(int[] nums1, int[] nums2) { if(nums1 == null || nums1.length == 0 || nums2 == nu
2022-02-15 20:17:33 534 1
原创 数组充当hash表:查找共用字符
给你一个字符串数组 words ,请你找出所有在 words 的每个字符串中都出现的共用字符( 包括重复字符),并以数组形式返回。你可以按 任意顺序 返回答案。题目链接:力扣基础:遍历字符串数组for(char c : words[i].toCharArray()){ temp[c - 'a']++; }class Solution { public List<String> commonChars(String[] words) {
2022-02-15 19:48:32 162
原创 赎金信:数组哈希
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true ;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。一定先把题给捋顺了,再写代码题目链接:力扣class Solution { //注意读清楚题意,弄明白每个变量的含义; public boolean canConstruct(String ransomNote, S
2022-02-15 19:04:11 81
原创 数组类型的哈希映射
题目:242.有效的字母异位词给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。题目链接力扣基础:字符串长度比较:str.length();length是一个方法,要加括号;但是数组的length是属性,数组长度是arr.length;获得字符串索引位置的字符对应的ASC码:str.charAt(i);数组的初始化值是0,当数组类型是数值型时;思路:
2022-02-15 18:24:46 174
原创 寻找链表的相交点:快慢指针数学分析
题目描述:力扣给定一个链表的头节点 head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。分析过程:力扣当fast和slow相遇时: fast...
2022-02-15 12:19:29 556
原创 寻找链表相交节点(相交引用地址相同)
面试题 02.07. 链表相交给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null。思路:链表相交情况:两个指针同时走两个链表a指针先走第一个链表 AC+CD,b指针先走第二个链表BC+CD;若两个链表相交,两个指针会同时走到c点,此时a指针的路径AC+CD+BC=b指针的路径BC+CD+AC;若两个指针不相交,两个指针同时走完两个链表,最后值指针值都是null; ...
2022-02-15 10:57:59 357
原创 快慢指针:删除链表的倒数第n个结点
19.给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。快指针先走n步,之后快慢指针一起走;快指针走到null,慢指针正好到第n个节点的前驱节点快指针指向第一个节点,慢指针指向虚拟节点(方便指到前驱节点)/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * Li..
2022-02-13 21:16:22 215
原创 回文链表,数组
234.给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode...
2022-02-12 21:06:44 167
原创 三句话弄懂:反转部分链表
92:给你单链表的头指针 head 和两个整数left 和 right ,其中left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。收获:反转链表的穿针引线1)定义next指针2)将next指针后的链表与cur相连3)将next节点插入pre和pre.next之间。/** * Definition for singly-linked list. * public class ListNode { * ..
2022-02-12 19:27:39 429
原创 链表的增删改查
设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val和next。val是当前节点的值,next是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性prev以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。在链表类中实现这些功能:get(index):获取链表中第index个节点的值。如果索引无效,则返回-1。addAtHead(val):在链表的第一个元素之前添加一个值为val的节点。插入后,新节点将成为链表的...
2022-02-12 10:57:38 1133
原创 反转链表:双指针法
给你单链表的头节点head,请你反转链表,并返回反转后的链表。指针:快慢指针pre指向前一个节点,cur指向当前节点,temp用于保存当前节点的下一个节点/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = va..
2022-02-12 10:50:05 266
原创 虚拟节点删除确定值的节点
收获:遍历整个链表判断条件是:cur.next!=null;链表遍历,中间指针的cur当前节点,当前节点变化的条件是,当前节点的next值不为val;/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; }
2022-02-11 18:24:42 447
原创 旋转矩阵边界问题
基础:list接口:List list = new ArrayList();方法:add;remove;收获:1.矩阵边界问题,关键是什么时候跳出循环测试代码:想用正方形,发现无法遍历中间的横杠和竖杠,这样的边界不能明确class Solution { public List<Integer> spiralOrder(int[][] matrix) { int loop =0; int startx = 0; ..
2022-02-09 19:58:32 386
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人