- 博客(49)
- 收藏
- 关注
原创 剑指 Offer 32 - I. 从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。 思路 /** * * 使用队列来中转节点,定义一个节点指针tmp = 队列头,依次插入tmp的左右节点,为空的不用管 * 直到最后一个tmp的 没有子节点则 插入完毕,队列出队完毕即可, * 循环 依次出队,并把出队的元素存放到链表中 * 最后返回链表转数组。 * * 时间复杂度为o(n) 遍历了整个二叉树节点,和遍历了整个链表这为 2n 常数省略 * * 空间复杂度o(n) : 使用了对列和链表储蓄元素为 2n 常数不管,则为o(n.
2021-10-22 22:39:41
189
原创 剑指 Offer 50. 第一个只出现一次的字符
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。 思路 /** * * 使用LinkedHashMap 储存 字符 ,字符为key ,使用1 /-1 来代表 一个和多个出现, * 插入集合中 如果 存在则 把 value 改为-1 ; 如果存在且value 已经是-1 这。跳出本循环 * 因为插入顺序和取出顺序一样。所以遍历集合找出第一个value 是1 的key 。返回即可 * * 时间负责度o(n) :使用两次循环遍历数组,第一次最大为n 第二个循环最多为.
2021-10-22 22:37:20
188
原创 剑指 Offer 11. 旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。 思路 /** * 旋转数组的最小值 * 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 * 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。 * 例如,数组[3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。 * * 使用二.
2021-10-22 22:34:06
169
原创 剑指 offer 04- 二维数组的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序 每一列都按照从上到下递增的顺序排序。 请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路 * 使用线性查找 * 由于给定的二维数组具备每行从左到右递增以及每列从上到下递增的特点,当访问到一个元素时,可以排除数组中的一行(当前值小于目标值)或者列 (当前值大于目标值)。 * 从二维数组的右上角即 arr[0][x]开始查找,如果当前元素等于目标值则返回true ,如果比目标值大则,向左移动一列.
2021-10-18 00:26:09
152
原创 剑指 offer 0~n-1中缺失的数字
* 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。 * 在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。 思路 /** * 循环遍历数组,每次遍历看当前元素加1 是不是后一个元素,如果是则继续循环 * 如果不是则返回加一后的结果。 * 如果循环完毕还没有返回结果 ,则说明所有的元素都是按后一个比前一个大1 的方式递增的 * 则如果数组最后一位的数值加一没有超过 n-1 则返回这个值 * 如果超过则返回数组第 0 号下.
2021-10-17 10:48:39
109
原创 剑指 offer 在排序数组中查找数字
在排序数组中查找数字 统计一个数字在排序数组中出现的次数 思路 /** * 在排序数组中查找数字 * 统计一个数字在排序数组中出现的次数。 * * 遍历整个数组,定义一个计数器,当发现这个元素时计数器加1 ;直到整个循环完毕 * * 时间复杂度o(n) 遍历了整个数组 * 空间复杂度o(1) 没有使用到额外的空间 * * */ 代码 public int search(int[] nums, int target) { int count = 0; for (.
2021-10-17 10:45:21
104
原创 剑指 offer 03 数组中重复的数字
数组中重复的数字 * 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。 * 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。 * 请找出数组中任意一个重复的数字。 思路 /** * 数组中重复的数字 * 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。 * 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。 * 请找出数组中任意一个重复的数字。 * * 借助HashMap 的特性,循.
2021-10-17 10:39:48
113
原创 剑指 Offer 05. 替换空格
替换空格 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 示例 1: 输入:s = “We are happy.” 输出:“We%20are%20happy.” 思路 /** * *剑指 Offer 05. 替换空格 *请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 * * 字符串转字符数组 * 循环判断空格,把空格替换为 %20 组合到新字符串中。 * * 时间复杂度o(n) 遍历了一遍数组 * 空间复杂度o(n) 创建了一个新的字符串 最坏情况全是空格 则需要 3n .
2021-10-15 21:34:00
112
原创 剑指 Offer 58 - II. 左旋转字符串
左旋转字符串 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。 思路 /** * 反转字符串 *使用字符串截取的方法 然后组合起来就行 * * 时间复杂度o(n) 字符串切片的时间复杂度为o(n) n是子串的长度 * 空间复杂度o(1) 没有使用额外空间 * */ 代码 public static String reverseLeftWords(S.
2021-10-15 21:31:29
83
原创 剑指 Offer 35. 复杂链表的复制
复杂链表的复制 请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。 思路 /** * 剑指 Offer 35. 复杂链表的复制(三个步骤) * 一:拷贝自己: * 遍历链表,把每个节点复制一个新节点。链接到当前节点的后面,并与其他节点相连接 * 是为了方便找到新random 位置 * 二:链接新链表 random * 遍历链表 把老链表的random指针,更新到新的.
2021-10-14 21:05:22
105
原创 剑指 Offer 06. 从尾到头打印链表
从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 思路 /** * * 从尾到头打印链表 * 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 *借助栈的先进后出的特点来完成 * 先全部压入栈中,然后得到元素个数,创建相同个数的数组, * 然后循环出栈到数组中。则完成链表的倒序 * * 时间复杂度o(n) 遍历链表把每个元素都压入到栈中,然后在全部出栈。2n 个过程 常数省略。.
2021-10-14 21:02:42
111
原创 剑指 Offer 24. 反转链表
Offer 24. 反转链表 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 思路 /** * * 使用了三个指针,一个是当前节点,一个是当前节点的前一个节点,一个是当前节点的后一个节点 * 遍历链表的时候,每次把当前节点的next指向前一个节点,前一个节点用指针 tmp 表示 * 然后所有指针向后移动一个.next 位置。 * 当a == null的时候 则列表反转完毕。返回tmp 即可!(因为a 最后被更新为null ,tmp 更新到了a 的位置所以返回tmp) * * 时.
2021-10-14 21:00:01
112
原创 剑指 Offer 09. 用两个栈实现队列
剑指 Offer 09. 用两个栈实现队列 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 思路 /** 两个栈实现一个队列 栈是先进后出,两个栈:一个是输入栈一个是中转栈, appendTail方法中所有需要插入的元素压入到栈1 deleteHead 方法中如果两个栈都没有元素则返回-1 如果是栈2 中没有元素则吧栈1 的所有元素压.
2021-10-13 16:12:15
90
原创 剑指offer30
包含min函数的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。 示例: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min(); --> 返回 -3. minStack.pop(); minStack.top(); --&g.
2021-10-13 16:08:53
109
原创 LeetCode12
罗马数字转整数 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况: I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 ..
2021-10-10 01:24:27
171
原创 LeetCoed24
两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: 输入:head = [1,2,3,4] 输出:[2,1,4,3] 思路 /** * 两两交换链表中的节点 * * 定义一个虚拟头节点,记录head 的位置 * 定义三个指针、头一个节点,两个交换指针,3个节点 3个节点的, * 处理整个链表,遇到奇数链表,最后一位不处理 * 时间复杂度 o (2/n) ;两两交换,只需要处理2/n 的..
2021-10-08 21:55:58
162
原创 LeetCode19
删除链表的倒数第 N 个结点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 进阶:你能尝试使用一趟扫描实现吗? 思路 /** * 删除链表的倒数第N个结点(允许使用一趟扫描) * 定义两个指针,一个指针负责遍历一个指针负责在n个后开始向后遍历,直到指针A 遍历完毕 * B指针所在的位置就是删除的位置 * 特殊判断,当删除的元素是第一个节点需要单独判断 count - n == 0; * 改变链表头的位置在第二个节点即可 * 时间复杂度o(n)遍历了整个链表 * 空..
2021-10-07 20:34:10
112
原创 LeetCode14
最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入:strs = [“flower”,“flow”,“flight”] 输出:“fl” 思路 /** *最长公共前缀 * 数组排序,(按照字典排序)会得到如下特性 * 如果存在公共前缀则 第一个字符串 和最后一个字符串中包含整个字符数组的最长公共前缀, * 如果不存在公共前缀 则第一个字符串和最后一个字符串 中没有公共的前缀 * * 则按照这个特性可以直接得出结果 * 首先使用.
2021-09-30 23:18:15
138
原创 LeetCode67
二进制求和 给你两个二进制字符串,返回它们的和(用二进制表示)。 输入为 非空 字符串且只包含数字 1 和 0。 示例 1: 输入: a = “11”, b = “1” 输出: “100” 思路 /** * 思路:二进制相加 * * 和十进制相加一样,通过一个算式相加 ,个位加个位,十位加十位 … * 使用循环来操作 * 定义一个中间变量 carry = 相同位的数值相加 。 * 然后对 2 取模 付给String tmp = carys % 2; * 然后对 carry /= 2;得到进位的数,以便.
2021-09-29 21:04:36
115
原创 LeetCode66
加一 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/plus-one 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 思路 ...
2021-09-29 14:13:29
172
原创 LeetCode83
删除排序链表中的重复元素 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。 返回同样按升序排列的结果链表。 思路 /** * * 思路:和数组去重的思路一样,定义两个指针 i (遍历指针)/ k(保存指针)保存第一次出现的元素 * 因为是升序的链表,所以重复的元素都是想临的,所以每次比较 i 和 i.next 位置的值就可找到相同的元素,然后删重复的节点。 * 直到i遍历完毕则把重复的元素也删除完毕。 * 和数组去重不一样的地方是数组是直接覆.
2021-09-28 00:29:49
76
原创 LeetCode35
搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 原题链接: 思路 /** * * 题意:要求在log n 的时间复杂度下完成 * 则使用二分的方法满足这个条件 * 题意:相当于在数组中查找这个数,如果存在则直接返回下标,如果不存在则找到第一个比它大的数 * 则满足 nums[mid] >= target * 如果数组所有的元素都比查找的元素小,则这个元素的位置.
2021-09-26 21:28:14
189
原创 LeetCode64
x 的平方根 给你一个非负整数 x ,计算并返回 x 的 平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 链接: 示例 1: 输入:x = 4 输出:2 示例 2: 输入:x = 8 输出:2 解释:8 的平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。 思路 题意我看了两遍,然后又看了一下示例过程,嗯嗯嗯嗯。我明白了 原来是这样的。 /** * 找到 谁.
2021-09-26 02:30:21
86
原创 剑指Offer40
最小的k个数 输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 原题链接 投机取巧思路 /** * 使用Arrays的方法sort 排序, * 然后把前k 个元素插入到新的数组中。 * 返回新数组即可 * */ 代码演示 public static int[] getLeastNumbers(int[] arr, int k) { if (arr == null || k < 0) { .
2021-09-24 23:52:36
76
原创 Leetcode326
3的幂 给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。 整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3x 链接: 思路 * 思路:判断一个数是不是3的幂次方 是返回true 否返回false * 则3^x = n 判断一个数是不是3的幂运算只需一直除以3 * 只要最后可以整除完就是3的幂次方 * 空间复杂度没有使用额外空间则为o(1); * 时间复杂度为o(log3 n); 在最坏的情况下 n可以被3完全整除,则 .
2021-09-23 21:00:02
92
原创 LeetCode88
合并两个有序数组 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列 。 注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 链接: 思路 定义 三个指针 指.
2021-09-22 23:45:21
81
原创 LeetCode27
移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素 链接 题解 定义两个指针,指针k 存储不移除的元素,指针 i 是找不删除的元素 首先两个指针都定义在0位置上,进入循环先判断元素是否 是要删除的元素, 如果是则k指针位置不变 i继续向下查找,直到发现不是删除的元素,然后保存到k指针位置.
2021-09-21 23:57:41
88
原创 LeetCode08
字符串转换整数 (atoi) 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。 leetcode原题 解题思路: * 思路:题意:实现字符串转整数,要求,前面有空格的省略,有正负 符号的 保留(同时存在正 负 符号的也返回 0 )然后 从第一个数字开始到第一次出现非数字的字符 结束。 * 要求在int范围内,超出int 返回 0 * 过程: * 一:如果字符有前导空格,首先字符转换为字符数组。然后使.
2021-09-20 23:36:58
140
原创 LeetCode07
整数反转 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 来源:力扣(LeetCode) 链接: 示例 1: 输入:x = 123 输出:321 思路: 使用循环取模运算 依次可以得到 个位,十位,。。。。 等等 然后通过如下公式组合数字。 res = res * 10 + x % 10 代码 public stat.
2021-09-19 04:45:16
91
原创 LeetCode26
删除有序数组中的重复项 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 来源:力扣(LeetCode) 原题链接 解题思路 – 因为有0(1)的空间限制,所以不能借助其他数组 。。。。 等等 ,只能在越数组修改。 因为数组是有序的,则说明所有重复的元素都是相邻的。 首先定义两个指针,指针i负责查找第一次出现的元素,指针k负责储存元素 指针k .
2021-09-18 20:43:56
119
原创 剑指offer64
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 示例: 输入: n = 3 输出: 6 短路思想: 与 运算符 A&&B 当A是false时,则B不会再去判断,会直接返回结果false 当A是true的时,则会判断B是否是true/false,是true则返回true,是false 则返回 false 或运算符 A|| B 当A是true的时候,则不会去判断B。会直接返回结果 true。 当A.
2021-09-17 00:36:20
66
原创 LeetCode21
合并两个有序的链表 原题 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3, LeetCode原题链接 解题思路: 因为两个链都是升序的,所以两个链表的头节点的值都是在自己链表中最小的值,所以 从两个链表的头节点开始比较,假设两个节点指针指向两个链表的头节点,那个节点值小那个节点放入到新的节点中,然后值小的节点指针更新位置到下一个节点,使用循环依次进行比较,直到其
2021-09-15 18:50:07
67
原创 LeetCode09
回文数 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。 来源:力扣(LeetCode) 原题连接 解决思路: 这里使用数字反转的方法来判断。 使用循环依次得到反转后的个位 十位,百位 。。。。 。 通过这个公式 res = res *10 + tmp%10 即可组合在一起, 然后判断反转后的数值与输入的数值是否相等,相等返回true;相反则false; 所有的负
2021-09-14 16:37:33
73
原创 LeetCode03
耗时一天时间搞定。 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例: 输入: s = “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 leetcode原题链接 解题思路:(网上很多这里是map加滑动窗口解决) map 可以在o(1)的时间复杂度下找到重复的字符 滑动窗口中没有重复字符 给定滑动窗口的左右两界为0下标位置 右界从0 开始到 字符数组的最后一位遍历 左界暂时位不动 进入循环后依次拿到 r 下标的字符,这时候m
2021-09-14 04:34:48
105
原创 LeetCode02
原题: 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 来源:力扣(LeetCode) https://leetcode-cn.com/problems/add-two-numbers 样例: 输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807 思路.
2021-09-13 04:25:38
68
原创 git/gitee 使用总结
git 使用步骤 初始化git仓库:git init 将文件复制到git仓库文件:cp /代码绝对地址 . 查看文件管理状态:git status 添加文件到暂存区:git add +.java 将暂存区文件添加到: git commit -m '描述信息' 上传到远程仓库:git push -u 远程名 分支名 配置git仓库 首先安装git : sudo dnf install git-all (Centos) sudo apt install git-all (Ubuntu).
2021-09-13 03:58:40
176
原创 Java 实现约瑟夫环问题
1.循环报数游戏,有n个人,从1到k报数,报道k 的退出游戏,得出最后获胜人的编号,编号从0开始。 思路: 一.创建大小为 n 的boolean类型的数组,并把所有元素初始化为true; 二.使用while循环,循环的条件为获胜的人数大于1。从0下标位置开始循环判断,这里分为三种情况: 1.index位置的值为true ,且count ==k ,这种情况是找到了退出游戏的人。则把这个位置的值改为false;活着的人数减一,计数继续从1开始计数。 2.index位置的值为true,且count != k;这
2021-01-09 03:16:57
528
3
原创 java String类
JAVA String类 Java中的String类包含了50多种方法,在Java中字符串属于对象,java提供Sting类来创建和操作字符串。 代码演示: String 3大特性 不变性:是⼀一个 immutable 模式的对象,不不变模式的主要作⽤用是当⼀一个对象需要被多线程共享并 频繁访问时,可以保证数据的⼀一致性。 常量池优化:String 对象创建之后,会在字符串串常量量池中进⾏行行缓存,下次创建同样的对象时,会直 接返回缓存的引⽤用。 final: String 类不可被继承,提高了系统的安全性
2020-12-16 22:48:03
187
原创 jvm/类加器/双亲委派机制
Java虚拟机本质上就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。Java语言的可移植性正是建立在Java虚拟机的基础上。任何平台只要装有针对于该平台的Java虚拟机,字节码文件(.class)就可以在该平台上运行。这就是“一次编译,多次运行”。 一.jvm的位置 二.jvm的体系结构 三.类加载 1.类加载器: 顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源
2020-12-16 18:10:01
207
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅