Java的leetcode
题目后面的数字表示自己做题的顺序与原题目无关。
解题不是关键最重要的是从这个题里面学到了什么!!(虽然z做过题之后会感觉当时特别蠢但是过程是重要的)
雪人不见花
坚持原创,杜绝水
展开
-
Java语法小结
语法小结MapString 、int、charset数组常用Ascii码小方法Map建立mapMap<Character, Integer> left_map = new HashMap<>();判断两个map是否相等left_map.equals(right_map)map放入值left_map.put(key,value);map取值char c = 'a'; left_map.get( c );map删除a的键值对left_map.remove( c);原创 2021-10-10 21:15:38 · 200 阅读 · 0 评论 -
子串分值和(java)-两行代码的巧妙
题目描述对于一个字符串 SS,我们定义 SS 的分值 f(S)f(S) 为 SS 中出现的不同的字符个数。例如 f(“aba”) = 2,f(“abc”) = 3, f(“aaa”) = 1f(“aba”)=2,f(“abc”)=3,f(“aaa”)=1。现在给定一个字符串 S [0...n − 1]S[0...n−1](长度为 nn),请你计算对于所有 SS 的非空子串 S [i...j](0 ≤ i ≤ j < n)S[i...j](0≤i≤j<n),f(S [i...j])f(S[i原创 2022-03-18 11:44:18 · 489 阅读 · 0 评论 -
对象比较、排序
比较对象Comparator强行对某个对象 collection 进行整体排序的比较函数compare//数组排序String[] str = new String[5];Arrays.sort(str, new Comparator<String>() { @Override public int compare(String o1, String o2) { // TODO Auto-generated method stub re原创 2021-11-20 14:09:16 · 170 阅读 · 0 评论 -
整数替换(30***)
题目描述给定一个正整数 n ,你可以做如下操作:如果 n 是偶数,则用 n / 2替换 n 。如果 n 是奇数,则可以用 n + 1或n - 1替换 n 。n 变为 1 所需的最小替换次数是多少?解题第一次枚举递归 3ms其中,为了防止n过大越界,使用n/2 +1 代替(n+1)/2 ,使用 n/2 代替(n-1)/2;class Solution { public int integerReplacement(int n) { if (n == 1) {原创 2021-11-19 22:14:53 · 98 阅读 · 0 评论 -
买卖股票的最佳时机(29)
买卖股票的最佳时机动态规划class Solution { public int maxProfit(int[] prices) { int n = prices.length; int sum =0; int start = prices[0]; for(int i =1;i<n;i++){ if(prices[i] - start >0){原创 2021-10-27 17:31:32 · 48 阅读 · 0 评论 -
实现 strStr()(28-kmp算法)
class Solution { public int strStr(String haystack, String needle) { int n1 = haystack.length(); int n2 = needle.length(); int result=0; if(n2 <=0) return result; for(int i原创 2021-10-27 09:04:38 · 138 阅读 · 0 评论 -
有效的数独(27)
class Solution { public boolean isValidSudoku(char[][] board) { int[][] row = new int[9][9]; int[][] column = new int[9][9]; int[][][] kuai = new int[3][3][9]; for(int i =0;i<9;i++){ f原创 2021-10-27 07:55:39 · 100 阅读 · 0 评论 -
买卖股票的最佳时机 II(26)
贪心不用去分类啥的,只考虑当前的最优解,即一天一天过class Solution { public int maxProfit(int[] prices) { int n = prices.length; int sum = 0; for(int i =0;i<n-1;i++){ if(prices[i] < prices[i+1]){ sum += prices[i+1] - p原创 2021-10-26 15:33:51 · 64 阅读 · 0 评论 -
字符串转换整数(25-自动机)
atoi题目描述第n次解题题解-自动机跟个智障一样,一道简单题调了俩点,可以说全程毫无难点,就是各种各样的各种情况考虑不全,这次记得下次必忘,还有就是换来换去还是那一种方法,也不知道在换什么,而且换半天,这个方法还没有进行到底。蠢的一批。题目描述第n次解题class Solution { public int myAtoi(String s) { String result= ""; int flag = 1; int length = s.length原创 2021-10-23 21:23:56 · 104 阅读 · 0 评论 -
验证回文串(24)
验证回文串题目描述第一次解题题解一、api二、api+双指针总结题目描述给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。示例 1:输入: "A man, a plan, a canal: Panama"输出: true解释:"amanaplanacanalpanama" 是回文串第一次解题class Solution { public boolean isPalindrome(String s) { char[] tem原创 2021-10-23 19:37:02 · 62 阅读 · 0 评论 -
众数(23- 摩尔投票法)
题目描述给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。示例 1:输入:[3,2,3]输出:[3]解题class Solution { public List<Integer> majorityElement(int[] nums) {int n = nums.length;Map<Integer,Integer> map = new HashMap<>();List<Integer> l = new原创 2021-10-22 23:49:57 · 142 阅读 · 0 评论 -
爬楼梯(22)
题目描述假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶题解class Solution { public int climbStairs(int n) { if(n<=1) return 1; if(n==2) return 2;原创 2021-10-22 23:36:16 · 60 阅读 · 0 评论 -
两数相加(21)——单链表
题目题解class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { int carry = 0; ListNode head = null,tail = null; while(l1 != null | l2 != null){ int n1 = l1==null?0:l1.val; int原创 2021-10-18 16:20:48 · 45 阅读 · 0 评论 -
整数反转(No.19)
整数反转题目描述解题历程第一次第二次题解总结题目描述给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。解题历程第一次没有对整数大小的范围进行判断;没有对其反转之后数字对大小进行判断;判断时分条件判断,判断条件太多太复杂,而且不全面。第一次的判断:if(t <Integer.MIN_VALUE || t&原创 2021-09-26 13:41:18 · 68 阅读 · 0 评论 -
加一(No.18)
加一题目描述解题历程第一次总结题目描述解题历程第一次class Solution { public int[] plusOne(int[] digits) { int n = digits.length; for(int i = n-1;i>=0;i--){ if(digits[i] < 9){//进入本次循环时 该位就要加一 所以无需在进位时加一 digits[i] += 1原创 2021-09-26 11:55:12 · 82 阅读 · 0 评论 -
两个数组的交集 II(No.20)
两个数组的交集 II题目描述解题历程第一次题解题目描述给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2,2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[4,9]解题历程第一次class Solution { public int[] intersect(int[] nums1, int[] nums2) { int n原创 2021-09-29 23:27:11 · 51 阅读 · 0 评论 -
3的幂(No.17)
3的幂题目描述解题历程第一次(超时)第二次第三次总结题目描述整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3x解题历程第一次(超时)递归 超出时间限制class Solution { public boolean isPowerOfThree(int n) { int k=0; int temp =0; if(n==0) return false; while(temp <= n){原创 2021-09-23 19:49:23 · 176 阅读 · 0 评论 -
字符串中的第一个唯一字符—Map(No.16*)
字符串中的第一个唯一字符题目描述解题历程第一次(超时)第二次第三次第四次总结题目描述给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。示例:s = "leetcode"返回 0s = "loveleetcode"返回 2解题历程第一次(超时)class Solution { public int firstUniqChar(String s) { char [] ch = s.toCharArray();原创 2021-09-23 00:12:42 · 67 阅读 · 0 评论 -
字符串的排列(No.15*)
字符串的排列题目描述解题历程第一次第二次第三次总结题目描述给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。换句话说,s1 的排列之一是 s2 的 子串 。示例 1:输入:s1 = "ab" s2 = "eidbaooo"输出:true解释:s2 包含 s1 的排列之一 ("ba").示例 2:输入:s1= "ab" s2 = "eidboaoo"输出:false示例 3:输入:s1= "abc" s2 = "bbbca"输出:true解原创 2021-09-22 19:26:42 · 67 阅读 · 0 评论 -
无重复字符的最长子串(No.14**)
无重复字符的最长子串题目描述解题历程第一次第二次(题解)总结题目描述给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例 :输入: s = "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。解题历程第一次 采用Hashset将其放入临时字符串temp,然同时根据是否放入的状态,并结合特定字符将原字符串s进行分割,但是当这一特定字符出现在s中时则会出现吞并现象。同时当出现字符包围时(原创 2021-09-20 10:35:37 · 64 阅读 · 0 评论 -
反转字符串中的单词 III(No.13)
反转字符串中的单词 III题目描述解题历程第一次思路二方法三(极佳)总结题目描述给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。示例:输入:"Let's take LeetCode contest"输出:"s'teL ekat edoCteeL tsetnoc"解题历程第一次class Solution { public String reverseWords(String s) { int i=0; Strin原创 2021-09-20 00:24:07 · 66 阅读 · 0 评论 -
两数之和(No.12)
两数之和题目描述题解解题历程第一次第二次题目描述给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 :输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。题解class原创 2021-09-14 21:08:11 · 96 阅读 · 0 评论 -
反转字符串(No.11)
题目描述编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。示例 :输入:["h","e","l","l","o"]输出:["o","l","l","e","h"]代码class Solution { public void reverseString(char[] s) {原创 2021-09-14 20:20:09 · 62 阅读 · 0 评论 -
只出现一次的数字(No.10*)
题目描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。题解思路使用位运算。异或运算有以下三个性质。任何数和 00 做异或运算,结果仍然是原来的数,即a⊕0=a。任何数和其自身做异或运算,结果是 0,即 a⊕a=0。异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。代码class Solution { public int singleNumber(int[] nums) {原创 2021-09-13 21:09:17 · 51 阅读 · 0 评论 -
存在重复元素(N0.9*)
存在重复元素题目描述题解方法一(哈希表)方法二(排序)题目描述给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。题解方法一(哈希表)思路对于数组中每个元素,我们将它插入到哈希表中。如果插入一个元素时发现该元素已经存在于哈希表中,则说明存在重复的元素。代码class Solution { public boolean containsDuplicate ( int [] nums ){原创 2021-09-13 21:01:25 · 84 阅读 · 0 评论 -
删除排序数组中的重复项(No.8)
删除排序数组中的重复项题目描述题解题目描述给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例:输入:nums = [1,1,2]输出:2, nums = [1,2]解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。题解class Solution原创 2021-09-13 20:51:10 · 48 阅读 · 0 评论 -
移动零(No.7)
题目描述给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]题解思路使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。注意到以下性质:左指针左边均为非零数;右指针左边直到左指针处均为零。因此每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对原创 2021-09-13 20:31:21 · 48 阅读 · 0 评论 -
旋转数组(No.6*)
旋转数组题目描述题解解题历程第一次第二次第三次(极佳)总结题目描述给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。进阶:(1)尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。(2)你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?题解解题历程第一次方法一(55.1MB)class Solution { public void rotate(int[] nums, int k) { int N = nums.len原创 2021-09-12 17:02:45 · 114 阅读 · 0 评论 -
有序数组的平方(No.5)
有序数组的平方题目描述题解解题历程第一次(极佳)代码记录总结题目描述给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。题解第一次提交为我的提交,其余的为官方题解,所以就不放代码了嘿嘿。解题历程第一次(极佳)首先将原数组元素平方得到新数组,实际上就是对这一新数组进行排序。一般数组的排序方法很多,但由于正负数平方的特性,可以选择更加合适的排序方法。第一次采用从左右两端开始遍历,并将其降入到新数组末尾(效果还不错)。class S原创 2021-09-11 10:09:50 · 103 阅读 · 0 评论 -
寻找两个正序数组的中位数(N0.4*)
寻找两个正序数组的中位数题目题解解题历程第一次第二次总结题目题解解题历程第一次积累不够,差的有点离谱就不记录代码了,仅记录一下思路。首先肯定是希望将两个数组合并成为一个新的有序数组,但是由于是只求中位数,所以不需要把数组全部合并,新数组的长度只需要合并到中位数附近的位置。其次就是仅仅采用了数组方法进行合并: 在两个数组的长度中取一个较小值,进行前半部分的遍历合并(显然这样并不合理)。之后改为将某一数组全部合并,而另一数组还有剩余时,将其剩余的部分继续遍历拼接到新数组的后面(但是由于边界、数组大原创 2021-09-11 08:42:24 · 41 阅读 · 0 评论 -
搜索插入位置(No.3)
搜索插入位置题目描述题解解题历程第一次低内存代码总结题目描述给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。题解class Solution { public int searchInsert(int[] nums, int target) { int n = nums.length; int left = 0, right = n -原创 2021-09-10 10:37:46 · 51 阅读 · 0 评论 -
第一个错误的版本(N0.2)
第一个错误的版本题目描述题解解题历程第一次(耗时长)第二次第三次(极佳)总结题目描述你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误原创 2021-09-10 09:59:21 · 55 阅读 · 0 评论 -
二分查找(No.1)
二分查找(易)题目描述解题解题历程第一次题解(错误的)第二次题解(正确)注意题目描述给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例 1:输入: nums = [-1,0,3,5,9,12], target = 9输出: 4解释: 9 出现在 nums 中并且下标为 4解题import java.util.Scanner;public class Soluti原创 2021-09-10 08:06:23 · 78 阅读 · 0 评论