-
- 20 有效的括号
- 21 合并两个有序链表
- 26 删除数组中的重复项
- 27. 移除元素
- 35. 搜索插入位置
20 有效的括号
使用replace一直替换
package top.lel.lc.easy.valid_parentheses;import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;/*** @author echo lovely* @date 2022/1/4 09:55* @description 有效的括号*/public class ValidParentheses {/*给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/valid-parentheses*/public static void main(String[] args) {// "(([]){})"System.out.println(checkByDeque("(([]){})"));System.out.println(checkByDeque("([0])"));}public static boolean easyDo(String s) {if (s == null || s.length() <= 0) {return false;}int len = s.length();if (len % 2 != 0) {return false;}while (s.contains("()") || s.contains("{}") || s.contains("[]")) {if (s.contains("()")) {s = s.replace("()", "");}if (s.contains("{}")) {s = s.replace("{}", "");}if (s.contains("[]")) {s = s.replace("[]", "");}}return s.length() == 0;}private static boolean checkByDeque(String s) {// "(([]){})"Deque<Character> deque = new LinkedList<>();for (char c : s.toCharArray()) {if (c == '(') {deque.push(')');} else if (c == '{') {deque.push('}');} else if (c == '[') {deque.push(']');} else if (deque.isEmpty() || c != deque.pop()) {return false;}}return deque.isEmpty();}static Map<String, String> dataMap = new HashMap<>();static {// ()[]{}dataMap.put("(", ")");dataMap.put("[", "]");dataMap.put("{", "}");}}
21 合并两个有序链表
链表preHead和头节点。操作头节点来确认链表的下一个节点。
package top.lel.lc.easy.merge_two_sorted_lists;/*** @author echo lovely* @description 合并两个有序列表为一个有序链表* <p>* https://leetcode-cn.com/problems/merge-two-sorted-lists/* 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。* @since 2022/4/11 15:01*/public class MergeTwoLists {public static void main(String[] args) {ListNode listNode = new ListNode(1, new ListNode(5));ListNode listNode2 = new ListNode(2, new ListNode(6));ListNode res = mergeTwoLists(listNode, listNode2);System.out.println(res);}public static ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode preHead = new ListNode(0);// 第一个节点ListNode pre = preHead;while (list1 != null && list2 != null) {if (list1.val < list2.val) {pre.next = list1;list1 = list1.next;} else {pre.next = list2;list2 = list2.next;}pre = pre.next;}if (list1 == null) {pre.next = list2;} else {pre.next = list1;}return preHead.next;}/*** Definition for singly-linked list.*/static class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) {this.val = val;}ListNode(int val, ListNode next) {this.val = val;this.next = next;}@Overridepublic String toString() {return "ListNode{" +"val=" + val +", next=" + next +'}';}}}
26 删除数组中的重复项
用了jdk的工具去重和双指针两种方式。
package top.lel.lc.easy.rm_dup_from_sorted_arr;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;/*** @author echo lovely* @description https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array* 给定一升序重复数组,去重,然后返回去重后的长度...* @since 2022/4/13 16:45*/public class RmDupFromArr {public static void main(String[] args) {int i = removeDuplicates(new int[]{1, 1, 2, 3, 4, 4, 5});System.out.println(i);int i1 = solution2(new int[]{1, 1, 2, 3, 4, 4, 5});System.out.println(i1);}public static int solution2(int[] nums) {// 使用j构造新数组int j = 0;for (int i = 0; i < nums.length; i++) {if (i == 0 || nums[i] != nums[i - 1]) {nums[j] = nums[i];j++;}}System.out.println(Arrays.toString(nums));return j;}public static int removeDuplicates(int[] nums) {List<Integer> collect = Arrays.stream(nums).distinct().boxed().collect(Collectors.toList());// nums = new int[collect.size()];for (int i = 0; i < collect.size(); i++) {nums[i] = collect.get(i);}System.out.println(Arrays.toString(nums));return collect.size();}}
27. 移除元素
双指针移除指定的元素
package top.lel.lc.easy.rm_ele;import java.util.Arrays;/*** @author echo lovely* @description* 移除给定数组中存在的元素, 并返回修改后的长度, 数组元素顺序可以改变* @since 2022/4/14 11:01*/public class RemoveElements {public static void main(String[] args) {int i = removeElement(new int[]{1, 4, 3, 2, 3, 4, 5, 4, 9}, 4);System.out.println(i);}/*** 返回数组的长度* 使用双指针覆盖...*/public static int removeElement(int[] nums, int val) {/*如果右指针指向的元素不等于 val,它一定是输出数组的一个元素,我们就将右指针指向的元素复制到左指针位置,然后将左右指针同时右移;如果右指针指向的元素等于 val,它不能在输出数组里,此时左指针不动,右指针右移一位。*/// 左指针用于偏移, 要被覆盖的值int left = 0;for (int right = 0; right < nums.length; right++) {if (nums[right] != val) {nums[left] = nums[right];left++;}}System.out.println(Arrays.toString(nums));return left;}
}
35. 搜索插入位置
- 利用二分法求解
- 利用数组拷贝,先考虑数组的临界点插入,然后在数组中的进行后移拷贝。
package top.lel.lc.easy.search_insert_poi;/*** @author echo lovely* @description 找到某个元素在排序数组的位置, 如果找不到* 按顺序插入, 并返回位置* https://leetcode-cn.com/problems/search-insert-position/* @since 2022/4/14 17:13*/public class SearchInsertPosition {public static void main(String[] args) {/*int i = searchInsert(new int[]{1, 3, 5, 6}, -88);System.out.println(i);*/int upgrade = upgrade(new int[]{1, 2, 3, 5, 6, 8}, 999);System.out.println(upgrade);}// 二分法public static int upgrade(int[] nums, int target) {int left = 0;int right = nums.length;System.out.println(left + (right - left) / 2);System.out.println((left + right) / 2);while (left < right) {int mid = left + (right - left) / 2;// System.out.println("中间下标..." + mid);if (nums[mid] < target) {// [mid + 1, right]left = mid + 1;} else {// [left, mid]right = mid;}// System.out.println(String.format("left: %s, right: %s", left, right));}//System.out.println(String.format("left: %s, right: %s", left, right));return left;}public static int searchInsert(int[] nums, int target) {for (int i = 0; i < nums.length; i++) {if (target == nums[i]) {return i;}}int res = 0;int[] arr = new int[nums.length + 1];int len = arr.length;// 拷贝一份数for (int i = 0; i < len - 1; i++) {arr[i] = nums[i];}arr[len - 1] = 0;for (int i = 0; i < len; i++) {// 1. 要找的数比数组中的数小if (target < arr[i]) {for (int j = 0; j < len - 1; j++) {arr[j + 1] = nums[j];}arr[0] = target;break;}// 2. 要找的数大于数组中的某个数if (target > arr[i] && i < len - 1 && target <= arr[i + 1]) {int insertIndex = i + 1;res = insertIndex;for (int k = insertIndex; k < len - 1; k++) {arr[k + 1] = nums[k];}arr[res] = target;break;}}// 要找的数最大if (arr[len - 1] == 0) {arr[len - 1] = target;return len - 1;}return res;}
}