![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
木十一的木马
这个作者很懒,什么都没留下…
展开
-
7. 整数反转
题目:给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−2 ^ 31, 2 ^ 31 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-integer题解:以123 为例,将123 % 10 得到3,之后将123 / 10 得到 12将12 % 10 得到2,之后将12原创 2022-03-02 15:40:26 · 227 阅读 · 0 评论 -
34. 在排序数组中查找元素的第一个和最后一个位置
题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array思路:数组是个有序并且升序的数组,所以我们可以使用二分法来实现。有以下三种情况:(1)target在没有在给原创 2021-12-28 16:37:27 · 262 阅读 · 0 评论 -
22. 括号生成
题目:数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。方法一:暴力法public List<String> generateParenthesis(int n) { List<String> combinations = new ArrayList<String>(); generateAll(new char[2 * n], 0, combinations); return原创 2021-12-08 22:45:02 · 80 阅读 · 0 评论 -
3. 无重复字符的最长子串
题目:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。使用滑动窗口:滑动窗口不断向前,当前元素不在set中 就加入set 然后更新最大长度,i++继续下一轮循环,set中有重复元素不断让j++ 并删除窗口之外的元素 直到滑动窗口内没有重复的元素复杂度:时间复杂度O(n),n是字符串的长度。空间复杂度是O(n),即set的空间,最差的情况是O(n)public int lengthOfLongestSubstring(String s) { Set<Cha原创 2021-12-04 10:22:26 · 330 阅读 · 0 评论 -
876. 链表的中间结点
题目:给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。解法一:单指针遍历两次,第一次遍历得到链表长度N,第二次遍历到N/2处返回该元素。public ListNode middleNode(ListNode head) { int n = 0; ListNode curr = head; while (curr != null){ ++ n; cu原创 2021-11-25 14:01:43 · 179 阅读 · 0 评论 -
344. 反转字符串
题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-string使用双指针,一个指针指从0向后遍历,一个指针从结尾向前遍历,然后进行元素的交换:public void reverseString(char[] s) { int n原创 2021-11-24 09:59:09 · 275 阅读 · 0 评论 -
189. 轮转数组
题目:给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。规律:当翻转数组后,数组原位置i的元素到了(i + k)% n 的位置。我们可以使用额外的数组来将每个元素放至正确的位置。用 n 表示数组的长度,我们遍历原数组,将原数组下标为 i 的元素放至新数组下标为 (i + k) mod n 的位置,最后将新数组拷贝至原数组即可。System.arraycopy的使用方法:public static void arraycopy(Object src, int srcPos, Ob原创 2021-11-22 21:37:30 · 269 阅读 · 0 评论 -
977. 有序数组的平方
题目:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。解法一:新建一个新数组来接受原数组平方后的值,然后对新数组进行排序:public int[] sortedSquares(int[] nums) { int[] arr = new int[nums.length]; for (int i = 0; i < nums.length; i ++){ arr[i] = num原创 2021-11-22 15:55:53 · 673 阅读 · 0 评论 -
53. 最大子序和
题目:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。动态规划:首先对数组进行遍历,当前最大连续子序列和为 sum,结果为 ans如果 sum > 0,则说明 sum 对结果有增益效果,则 sum 保留并加上当前遍历数字如果 sum <= 0,则说明 sum 对结果无增益效果,需要舍弃,则 sum 直接更新为当前遍历数字每次比较 sum 和 ans的大小,将最大值置为ans,遍历结束返回结果时间复杂度:O(n)public int原创 2021-11-17 23:04:50 · 168 阅读 · 0 评论 -
234. 回文链表
题目:给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。currentNode 指针是先到尾节点,由于递归的特性再从后往前进行比较。frontPointer 是递归函数外的指针。若 currentNode.val != frontPointer.val 则返回 false。反之,frontPointer 向前移动并返回 true。private ListNode frontPointer; private boolean r原创 2021-10-26 19:27:28 · 50 阅读 · 0 评论 -
206. 反转链表
题目:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。public ListNode reverseList(ListNode head) { ListNode prev = null; ListNode curr = head; while (curr != null) { ListNode next = curr.next; curr.next = prev;原创 2021-10-23 19:57:08 · 65 阅读 · 0 评论 -
203. 移除链表元素
题目:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。public ListNode removeElements(ListNode head, int val) { ListNode dummyHead = new ListNode(0); dummyHead.next = head; ListNode temp = dummyHead; whil原创 2021-10-22 21:56:22 · 56 阅读 · 0 评论 -
4. 寻找两个正序数组的中位数
题目:给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。思路:新建一个大小为给定的两个数组长度之和的新数组,这个新数组的长度是给定的那两个数组长度和。然后将两个数组中的值放入到新数组中。如果新数组的长度是奇数,那么中位数就是中间索引对应的值,如果是偶数,那么中位数就是中间两个数之和再除二。代码:public static double findMedianSortedArrays(int[] nums1, int[] num原创 2021-10-14 13:29:15 · 56 阅读 · 0 评论 -
242. 有效的字母异位词
题目:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/valid-anagram//暴力法:对两个进行排序,看他们是否一样; 时间复杂度为O(NlogN)public boolean isAnagram(String s, String t) { if (s原创 2021-10-12 20:33:59 · 81 阅读 · 0 评论 -
剑指 Offer II 036. 后缀表达式
题目:根据 逆波兰表示法,求该后缀表达式的计算结果。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。从左到右扫描数组,遇到操作数则入栈,遇到操作符则取出栈顶元素和第二个元素进行运算,运算完的的结果重新入栈直到遇到下一个操作符。public static int evalRPN(String[] tokens) { Stack<Integer> stack = new Stack<>(); for (int原创 2021-10-12 13:46:56 · 65 阅读 · 0 评论 -
20. 有效的括号
题目:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/valid-parentheses这里我使用了栈的数据结构:将元素放入到栈顶,如果遇到它的另一半括号那么出栈,最后判断栈是否为空,若为空,返回true,否则返回false。public boolean isV原创 2021-10-09 14:54:55 · 51 阅读 · 0 评论 -
70. 爬楼梯
题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。思路:要上到第一节楼梯:一次一步 1要上到第二节楼梯:两次一步或一次两步 2要上到第三节楼梯:这样想,他是在第一节楼梯走两步或在第二节楼梯走一步,所以f(3) = f(2) + f(1)要上到第四节楼梯:在第二节楼梯走两步或在第三节楼梯走一步,f(4) = f(3) + f(2)原创 2021-10-07 19:32:58 · 58 阅读 · 0 评论 -
11. 盛最多水的容器
题目:给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/container-with-most-water1.第一种:比较容易想到的是两层for循环,不断的计算每两根柱子的面积,得原创 2021-10-07 01:38:03 · 51 阅读 · 0 评论 -
283. 移动零
题目:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。public void moveZeroes(int[] nums) { int j = 0; for (int i = 0; i < nums.length; ++i){ if (nums[i] != 0){ nums[j] = nums[i]; if (i != j){原创 2021-10-06 19:12:55 · 83 阅读 · 0 评论 -
剑指 Offer II 018. 有效的回文
题目:给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。本题中,将空字符串定义为有效的 回文串 。回文串:“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。我使用了双指针的方法,一个指针从前往后,一个指针从后往前,若不是数字或字母则跳过,如果两个指针指向的字符相同,则同时移动再判断它们指向的下一个字符是否相同;这样一直移动直到两个指针相遇,因为忽略字母的大小写所以需要将字母都转换成小写。这里需要用到两个方法:1原创 2021-10-05 15:30:40 · 119 阅读 · 0 评论 -
剑指 Offer II 023. 两个链表的第一个重合节点
题目:给定两个单链表的头节点 headA 和 headB ,请找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。思路:想办法把两个链表右对齐,这样从右往左最后一个相同节点就是相交节点了;在A和B不相同的情况下A和B各自移动到下一节点,移动到空的时候变为另外一个链的头结点继续(也即在A链的末尾加上B链,B链的末尾加上A链,右端必然是对齐的);public ListNode getIntersectionNode(ListNode headA, ListNode headB原创 2021-09-30 23:55:30 · 162 阅读 · 0 评论 -
剑指 Offer II 068. 查找插入位置
题目:给定一个排序的整数数组 nums 和一个整数目标值 target ,请在数组中找到 target ,并返回其下标。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/N6YdxV使用二分法,若数组中存在目标值则返回其下标,若不存在那么返回其应该插入位置的下表,先使用二分法去数组中查找元素,如果找不到的话,返回leftpublic int原创 2021-09-29 18:56:44 · 62 阅读 · 0 评论 -
LeetCode58. 最后一个单词的长度
题目:给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。从后往前遍历,若最后一位不是字母则跳过,否则长度加1,直到下一个不是字母处。java代码:public int lengthOfLastWord(String s) { int length = 0; for (int i = s.length() - 1; i >= 0; i--) {原创 2021-09-25 14:22:02 · 51 阅读 · 0 评论 -
LeetCode两数相加
题目:给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/add-two-numbers思路:将两个链表看成是相同长度的进行遍历,如果一个链表较短则在前面补 00,比如 987 + 23 = 987 + 023 =原创 2021-09-24 13:42:34 · 71 阅读 · 0 评论 -
剑指 Offer II 012. 左右两边子数组的和相等
题目:给你一个整数数组 nums ,请计算数组的 中心下标 。数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/tvdfij代码:public原创 2021-09-21 23:52:31 · 78 阅读 · 0 评论 -
剑指 Offer II 003. 前 n 个数字二进制中 1 的个数
题目:给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。半天才读懂题,最后返回的数组中每个索引对应的值是前N个数二进制1的个数思路:当前数为偶数时,它二进制1的个数为 num/2 的二进制中1的个数;当前数为奇数时,它二进制1的个数为前一个数二进制1的个数+1;代码:public int[] countBits(int n) { int[] arr = new int[n + 1]; for (int原创 2021-09-20 00:29:57 · 57 阅读 · 0 评论