力扣热题100(方便自己复习,自用)
力扣热题100
1. 两数之和 - 力扣(LeetCode)
- 查找两数之和是不是等于target
- 也就是我们找到一个数之后,用target将其减掉,再寻找应当对应的元素是什么
- 每找到一个数,我们就将其放在集合中,因为集合中可以去重,保证我们只遍历过一次,然后再继续遍历数组,将target减去当前的数组中的值,看看已经遍历过的数组中是不是有该值,有的话就加入返回结果。
- 没有的话就将其加入。
思想:用集合存放遍历过的数值,然后根据当前定位到的数值,判断自己寻找的数值在集合中是否出现,若出现就返回结果。
class Solution {public int[] twoSum(int[] nums, int target) {int[] res = new int[2];Map<Integer,Integer> map = new HashMap<>();if(nums.length == 0 || nums == null){return res;}for(int i = 0;i < nums.length;i++){int temp = target - nums[i];if(map.containsKey(temp)){res[0] = map.get(temp);res[1] = i;}else{map.put(nums[i],i);}}return res;}
}
49. 字母异位词分组 - 力扣(LeetCode)
思想:如果可以重组后构成一个单词,那么可以把字符串先转换成字符数组,然后对字符数组中的字母进行排序。将排序过后的字符数组转换成字符串,然后再作为键出现。然后把键一样的值添加到该键对应的列表当中即可。如果没有改键,那就创建一个新的链表,并同时把键值对插入进去。
class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String,List<String>> map = new HashMap<>();for(String str : strs){char[] array = str.toCharArray();Arrays.sort(array);String key = new String(array);List<String> list = map.getOrDefault(key,new ArrayList<>());list.add(str);map.put(key,list);}return new ArrayList<List<String>>(map.values());}
}
128. 最长连续序列 - 力扣(LeetCode)
思想:遍历该数组,当遍历到的元素,在该集合中有前驱的时候就跳过。也就是说,遍历到的数字必须是该序列中第一个打头的才进行处理和操作。并且要记录是当前数字打头的连续序列更长还是已经记录的旧的更长。
class Solution {public int longestConsecutive(int[] nums) {Set<Integer> sets = new HashSet<>();for(int num : nums){sets.add(num);}int maxLong = 0;for(int set : sets ){int num = set;if(!sets.contains(num - 1)){int curLong = 1;while(sets.contains(num+1)){num++;curLong++;}maxLong = Math.max(curLong,maxLong);}}return maxLong;}
}
283. 移动零 - 力扣(LeetCode)
思想:使用双指针法进行求解,左指针先不动,指向已经处理好的序列的尾部,右指针寻找不为零的时候,如果不为零,就和left指向的元素进行交换。到最后,left之前的数组就都是不为零的,且位置没有被改变。
class Solution {public void moveZeroes(int[] nums) {int left = 0, right = 0,len = nums.length;while(right < len){if(nums[right] != 0){int temp = nums[right];nums[right] = nums[left];nums[left++] = temp;}right++;}}
}
饿了吗2025.3.21
1.求V字形的数组,也就是连续的三个数字,中间是凹进去的。
package dlut.com.java;import java.util.Scanner;
public class Main{public static void main(String[] args){Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int[] arr = new int[n];int count = 0;for(int i = 0;i < n;i++){arr[i] = scanner.nextInt();}for(int i = 1;i < n-1;i++){if(arr[i]<arr[i-1] && arr[i]<arr[i+1]){count++;}}System.out.println(count);}
}
2.第一个数字n:是字符串的长度,第二个数字g:是相差应该小于等于的,若数组的位置下标奇偶性相同,且满足相差小于等于g那么就是有缘分的位置对数。
package dlut.com.java;import java.util.Scanner;
public class Main{public static void main(String[] args){Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int g = scanner.nextInt();String s = scanner.next();int[] count1 = new int[26];int[] count2 = new int[26];char[] c = s.toCharArray();for(int i = 0;i < n;i++){if(i%2==0){//记录中间差几个元素count1[c[i] - 'a']++;}else{count2[c[i] - 'a']++;}}//count的下标就是和a相差几个元素for(int i = 0;i<26;i++){if(count1[i] != 0)System.out.println("count1["+i+"]="+count1[i]);}for(int i = 0;i<26;i++){if(count2[i] != 0)System.out.println("count2["+i+"]="+count2[i]);}long sum = 0;for(int i = 0;i < 26;i++){sum += (long)count1[i]*(count1[i]-1)/2;for(int j = i+1;j<26;j++){if(Math.abs(j - i - 1)<=g){sum +=(long) count1[i]*count1[j];}}}for(int i = 0;i < 26;i++){sum += (long)count2[i]*(count2[i]-1)/2;for(int j = i+1;j<26;j++){if(Math.abs(j - i - 1)<=g){sum +=(long) count2[i]*count2[j];}}}System.out.println(sum);}
}