刷题
喂他柠檬茶
这个作者很懒,什么都没留下…
展开
-
leetcode237删除链表中的节点(JAVA版)
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。题目意思难理解,看评论才发现,所做的事情就是自己删自己/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { pub原创 2020-12-31 21:50:09 · 136 阅读 · 0 评论 -
leetcode234回文链表(JAVA版)
请判断一个链表是否为回文链表。首先使用快慢指针,找到链表的中间节点,然后使用leetcode206的方法反转链表,比较反转后的链表与前半部分是否相等/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { publi原创 2020-12-30 09:56:20 · 106 阅读 · 0 评论 -
leetcode232用栈实现队列(JAVA版)
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size原创 2020-12-29 09:34:52 · 130 阅读 · 0 评论 -
leetcode231 2的幂(JAVA版)
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。一开始就想到简单的方方法,果然超时了class Solution { public boolean isPowerOfTwo(int n) { int a=1; while (a<=n) { if(a == n) { return true; } a*=2; } return false; }}使用位运算,很巧妙,不看答案真想不出来class原创 2020-12-28 20:42:24 · 144 阅读 · 1 评论 -
leetcode228汇总区间(JAVA版)
给定一个无重复元素的有序整数数组 nums 。返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。列表中的每个区间范围 [a,b] 应该按如下格式输出:“a->b” ,如果 a != b“a” ,如果 a == b循环遍历class Solution { public List<String> summaryRanges(int[] nums)原创 2020-12-27 10:22:28 · 126 阅读 · 0 评论 -
leetcode226翻转二叉树(JAVA版)
翻转一棵二叉树。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public TreeNode invertTree(TreeNode root) {原创 2020-12-26 10:39:07 · 122 阅读 · 0 评论 -
leetcode225用队列实现栈(JAVA版)
使用队列实现栈的下列操作:push(x) – 元素 x 入栈pop() – 移除栈顶元素top() – 获取栈顶元素empty() – 返回栈是否为空注意:你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。你可以假设所有操作都是有效的(例如, 对一个空原创 2020-12-25 20:13:07 · 73 阅读 · 0 评论 -
leetcode2019存在重复元素II(JAVA版)
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。暴力法class Solution { public boolean containsNearbyDuplicate(int[] nums, int k) { for (int i = 0; i < nums.length-1; i++) { for (int j = i+1; j < nums.leng原创 2020-12-24 10:52:01 · 88 阅读 · 0 评论 -
leetcode217存在重复元素(JAVA版)
给定一个整数数组,判断是否存在重复元素。如果任意一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。使用哈希表,非常简单class Solution { public boolean containsDuplicate(int[] nums) { HashMap<Integer, Character> map = new HashMap<>(); for (int i = 0; i < nums.原创 2020-12-23 21:24:56 · 102 阅读 · 0 评论 -
leetcode206反转链表(JAVA版)
反转一个单链表。动图转载自leetcode王尼玛递归 // public static ListNode reverseList(ListNode head) { if (head == null || head.next == null) return head; //先递归找到到链表的末端结点,从后依次反转整个链表 ListNode reverseHead = reverseList(head.next); //再将当前节点设置原创 2020-12-22 09:55:19 · 118 阅读 · 0 评论 -
leetcode205同构字符串(JAVA版)
给定两个字符串 s 和 t,判断它们是否是同构的。如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。明出处。两种方法,第一种,遍历数组,判断两个字符串当前元素在字符串中首次出现的位置是否相等,如果相等,则说明是同构字符串,代码如下:class Solution { public boolean isIsomorphic(String s, String t)原创 2020-12-21 10:06:17 · 139 阅读 · 0 评论 -
leetcode204计数质数(JAVA版)
统计所有小于非负整数 n 的质数的数量。简单题,但是解题的过程不简单,第一遍暴力法,超时class Solution { public int countPrimes(int n) { int flag = 0; if (n>2) flag = 1; for (int i = 0; i < n; i++) { for (int j = 2; j < i ; j++) { if (i % j == 0) { break;原创 2020-12-20 10:54:42 · 168 阅读 · 1 评论 -
leetcode203移除链表元素(JAVA版)
删除链表中等于给定值 val 的所有节点。前面三步操作比较重要,新建一个节点,然后结点的下一个节点指向给定链表的头节点,这样在后面的循环中,就不会出现漏下第一个节点的问题了,代码如下:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Sol原创 2020-12-19 10:21:59 · 104 阅读 · 1 评论 -
leetcode202快乐数(JAVA版)
编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。如果 n 是快乐数就返回 True ;不是,则返回 False 。暴力循环法class Solution { public boolean isHappy(int n) { int flag =0; while(n != 1) {原创 2020-12-18 09:27:27 · 88 阅读 · 0 评论 -
leetcode198打家劫舍(JAVA版)
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。采用dp规划算法,dp 方程 dp[i] = max(dp[i-2]+nums[i], dp[i-1])class Solution { public int rob(int[] nums) {原创 2020-12-17 11:03:07 · 134 阅读 · 0 评论 -
leetcode191位1的个数(JAVA版)
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。提示:请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。进阶:如果多次调用这个函数,你将如何优化你的算法?原创 2020-12-16 09:34:02 · 213 阅读 · 0 评论 -
leetcode190颠倒二进制位(JAVA版)
颠倒给定的 32 位无符号整数的二进制位。循环32次,每次取出最后一位,放在新的数里,旧的树不断循环右移,新的数不断循环左移public class Solution { // you need treat n as an unsigned value public int reverseBits(int n) { int num = 0; int temp = 0; for (int i = 0; i < 32; i++) { num原创 2020-12-15 10:00:42 · 249 阅读 · 0 评论 -
leetcode172阶乘后的零(JAVA版)
给定一个整数 n,返回 n! 结果尾数中零的数量。观察阶乘后的值,得到规律,乘法因子里面有多少个5就有多少个零class Solution { public int trailingZeroes(int n) { int num = 0; if (n < 5) return 0; while(n >= 5 ) { num += n/5; n /=5; } return原创 2020-12-14 10:11:28 · 114 阅读 · 0 评论 -
leetcode171Excel表序列号(JAVA版)
给定一个Excel表格中的列名称,返回其相应的列序号。例如,非常简单,就是一道二十六进制的题目,按照十进制的思路做就好class Solution { public int titleToNumber(String s) { int num = 0; for (int i = 0; i < s.length(); i++) { num *= 26; num += (int)s.charAt(i) -64; }原创 2020-12-13 09:42:02 · 167 阅读 · 0 评论 -
leetcode169多数元素(摩尔投票法)
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。我的思路很简单,先排序,然后取中间位的数字,但运行效率很低。class Solution { public int majorityElement(int[] nums) { int temp = 0; for (int i = 0; i < nums.length; i++) {原创 2020-12-12 10:43:45 · 104 阅读 · 0 评论 -
leetcode168Excel列表名称(JAVA版)
给定一个正整数,返回它在 Excel 表中相对应的列名称。例如,主要难在题目不清晰就是让你求上面的字符而已,代码如下class Solution { public String convertToTitle(int n) { if (n <= 0) return ""; StringBuilder s = new StringBuilder(); while(n > 0){ n--; char str1 = (cha原创 2020-12-11 10:29:12 · 66 阅读 · 0 评论 -
leetcode167两数之和II-输入有序数组(JAVA版)
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。暴力循环法解题class Solution { public int[] twoSum(int[] numbers, int target) { int[] result = {0,0}; if (numbers[0] + numbers[1] == target) { result[0] =原创 2020-12-10 15:26:26 · 116 阅读 · 0 评论 -
leetcode160相交链表(JAVA版)
编写一个程序,找到两个单链表相交的起始节点。这道题目的我又是暴力法,很好理解,遍历两个链表,找相交点。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public原创 2020-12-09 10:08:59 · 81 阅读 · 0 评论 -
leetcode155最小栈(JAVA版)
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。我没有思路,参考别人的思路:栈顶如果为当前的最小值,则下面一个保存的是上一次的最小值,即次小值。class MinStack { /** initialize your data structure here. */ private int原创 2020-12-08 10:31:58 · 145 阅读 · 0 评论 -
leetcode141环形链表(JAVA版)
判断环形链表的常用方式是使用快慢指针,在遇到环的时候,由于速度不一样,快慢指针会在环上相遇,此时证明链表有环,如果快指针先指向空,说明链表没有环。/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * .原创 2020-12-07 21:30:39 · 99 阅读 · 0 评论 -
leetcode136只出现一次的数字(JAVA版)
我没有想出来线性复杂度的方法,看了评论区大神的提示才恍然大悟交换律:a ^ b ^ c <=> a ^ c ^ b任何数于0异或为任何数 0 ^ n => n相同的数异或为0: n ^ n => 0class Solution { public int singleNumber(int[] nums) { for (int i = 1; i <nums.length ; i++) { nums[0] = nu.原创 2020-12-07 20:37:49 · 100 阅读 · 0 评论 -
leetcode125验证回文串(JAVA版)
我的想法是把所有特殊字符替换成空,然后把大写字母转换成小写,双指针从前后开始判断,但效率较低,想要提高效率可以使用ascii码判断字母进行判断class Solution { public boolean isPalindrome(String s) { if(s == null) return true; s = s.replaceAll("[\\pP‘’“”`?| ]", ""); s = s.toLowerCase(); int p = 0; int q.原创 2020-12-05 11:04:05 · 92 阅读 · 0 评论 -
leetcode123买卖股票的最佳时机III(JAVA版)
我的思路是前i天的最大收入加上后n-i天的最大收入之和,即为最大收入,但代码执行超时。class Solution { public int maxProfit(int[] prices) { if (prices.length<=1) return 0; int max_1 = 0; int max_2 = 0; int max = 0; for (int i = 0; i < prices.length;.原创 2020-12-04 11:00:06 · 178 阅读 · 0 评论 -
leecode122买卖股票的最佳时机II(JAVA版)
我的思路被昨天的动态规划所限制,修改昨天的代码,只要前n天赚的钱大于0,记录下来,然后再求剩余天数赚的最多的钱。class Solution { public int maxProfit(int[] prices) { if (prices.length<=1) return 0; int max = 0; int all = 0; int min = prices[0]; for (int i = 0; i < p.原创 2020-12-03 10:22:01 · 128 阅读 · 0 评论 -
leetcode121买卖股票的最佳时机(JAVA版)
暴力法,最后一天与之前每一天进行比较,差值为利润,得到最大的利润,输出class Solution { public int maxProfit(int[] prices) { if(prices.length <= 1) return 0; int dis = 0; for (int i = prices.length-1; i >= 0; i--) { for (int j = i; j >= 0; j--) { .原创 2020-12-02 10:27:08 · 74 阅读 · 0 评论 -
leetcode119杨辉三角II(JAVA版)
修改昨天的代码,注意rowIndex要加1才是循环里的行数class Solution { public List<Integer> getRow(int rowIndex) { int[][] yangHui = new int[rowIndex+1][rowIndex+1]; List<Integer> subList = new ArrayList<>(); for(int i = 0; i < rowInde.原创 2020-12-01 10:26:42 · 91 阅读 · 0 评论 -
leetcode118杨辉三角(JAVA版)
采用数组的思想,按照后一项等于上面两项的和,再在首尾加上一class Solution{ public List<List<Integer>> generate(int numRows) { List<List<Integer>> list = new ArrayList<>(); int[][] yangHui = new int[numRows][numRows]; for(int i = 0; i < numR.原创 2020-11-30 19:53:29 · 156 阅读 · 0 评论 -
leetcode104二叉树的最大深度(JAVA版)
又是递归,思路是递归一次,值加一,比较左树右树递归的结果。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, Tree.原创 2020-11-29 10:22:31 · 97 阅读 · 0 评论 -
leetcode101对称二叉树(JAVA版)
先看看大神的评论,可能看着看着就恍然大悟了:递归的难点在于:找到可以递归的点 为什么很多人觉得递归一看就会,一写就废。 或者说是自己写无法写出来,关键就是你对递归理解的深不深。对于此题: 递归的点怎么找?从拿到题的第一时间开始,思路如下:1.怎么判断一棵树是不是对称二叉树? 答案:如果所给根节点,为空,那么是对称。如果不为空的话,当他的左子树与右子树对称时,他对称2.那么怎么知道左子树与右子树对不对称呢?在这我直接叫为左树和右树 答案:如果左树的左孩子与右树的右孩子对称,左树的右孩子与右树的左孩子.原创 2020-11-28 10:43:18 · 194 阅读 · 0 评论 -
leetcode100相同的树(JAVA版)
对二叉树过于陌生,参考评论中递归的思想,逐个进行比较。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNo.原创 2020-11-27 10:12:28 · 88 阅读 · 0 评论 -
leetcode88合并两个有序数组(JAVA版)
思路是把nums2加到nums1里面,然后再对nums1的非0部分进行排序class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { for (int i = 0; i < n; i++) { nums1[m] = nums2[i]; m++; } int temp = 0; for (int i = 0; i < m; i++) { .原创 2020-11-26 10:28:59 · 87 阅读 · 0 评论 -
leetcode83删除链表中的重复元素(JAVA版)
可能是因为对链表的不熟练,看到链表题就有种天然的恐惧,但这道题目绝对属于简单题,只要通过非常简单的判断,就可以跳过重复元素。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode del.原创 2020-11-25 10:28:03 · 157 阅读 · 0 评论 -
leetcode70爬楼梯(JAVA版)
这题目我一开始想的是排列组合,随着2的个数不同,排列组合的数目不同,但在数据较大计算阶乘的时候发生了溢出,无法通过测试代码 public static int climbStairs(int n) { int num = 0; int n1 = n; int num_2 = -1; int sum=0; while(n1 >= 0) { n1-=2; num_2++; //2的个数 } for .原创 2020-11-24 14:26:02 · 162 阅读 · 0 评论 -
leetcode69x的平方根(JAVA版)
一开始想用二分法,在死循环中,利用完全相等作为判断条件,得到平方根。但在实际操作过程中,会遇到4开根号,得到结果是1.99999999,计算机会舍去小数,从而导致结果出错,参考别人的解答,使用max-min>0应该是二分法最好的判断条件了class Solution { public int mySqrt(int x) { if(x == 1) return 1; int max = x; int min = 0; int n.原创 2020-11-23 10:39:13 · 161 阅读 · 0 评论 -
leetcode2两数相加(C语言版)
一开始考虑的较少,最高位进位,两个链表长度不一样都没有考虑,对链表的知识也遗忘了很多struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){ int num,flag = 0; struct ListNode* pre = (struct ListNode*)malloc(sizeof(st...原创 2020-01-10 14:34:20 · 353 阅读 · 0 评论