力扣刷题day02
有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
解法:我们可以使用栈来解决这个问题。首先出现的右括号必须先被匹配掉,因此我们可以先把该字符串进行遍历,如果是左括号,就把他压入栈中,遇到第一个右括号就和栈顶元素进行匹配,匹配完全就把该栈顶元素移除栈,这样循环直到所有的符号都进行匹配。
细节:匹配时,我们可以把右括号作为key,左括号当做value存入到哈希表中。
public boolean isValid1(String s) {
int length = s.length();
//偶数位才能匹配完全
if (length % 2 == 1) {
return false;
}
//把对应的匹配字符存入哈希表中
Map<Character, Character> map = new HashMap<>();
map.put(')', '(');
map.put(']', '[');
map.put('}', '{');
//创建一个栈
Stack<Character> stack = new Stack<>();
//循环该字符串
for (int i = 0; i < length; i++) {
char c = s.charAt(i);
//如果哈希表中有这样的key,说明是右半部分括号,进行匹配并且出栈
if (map.containsKey(c)){
//栈中有元素并且能够匹配上才能进行出栈
if (stack.isEmpty() || stack.peek() != map.get(c)){
return false;
}
//出栈
stack.pop();
}else{
stack.push(c);
}
}
//当栈中还有元素,则没有完全匹配,返回false,如果没有了元素,则匹配完全,返回true
return stack.isEmpty();
}
合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的
解法:我们可以使用递归的思想,先创建一个新的链表用来接收并返回,定义一个指针变量pre来表示头结点,然后循环遍历比较两个链表中的值,两个链表中较小的那个节点连接到新节点中,然后源节点后移一位,以此反复,直到有一个链表的所有节点都到了要返回链表后面,这时只有一个链表还剩下一个节点,判断后也把该节点连接到要返回的链表中。
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode list = new ListNode();
ListNode pre = list;//指针指向头结点
while(list1 != null && list2 !=null){
if(list1.val < list2.val){
//l1更小,指针指向更小的节点,l1节点往后移一位
pre.next = list1;
list1 = list1.next;
}else{
pre.next = list2;
list2 = list2.next;
}
//新创建的链表后移一位
pre = pre.next;
}
//最后l1或者l2中还剩余一个节点
pre.next = list1 == null ? list2:list1;
return list.next;
}
}
删除有序数组中的重复项
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致
解法:使用快慢指针来解决。首先,当数组为空时,不需要删除。一般情况下,我们设置一个慢指针指向第一个元素,快指针指向第二个元素,比较快指针指向的元素和前一个元素是否相等,如果想等,则快指针继续向后走,直到快指针指向的元素和前一个元素不等,那么说明快指针和慢指针之间的元素都是相同的元素,只需要保留一个。那么我们就让慢指针向前走一步,把快指针指向的数字赋值给慢指针指向的元素,快指针继续向前走。当快指针超出了数组的范围,那么慢指针所指向的就是数组中的最后一个元素,那么数组的长度就是慢指针加1.
int length = nums.length;
int slow = 0;
int fast = 1;
if (length==0){
return 0;
}
while(fast < length){
if(nums[fast] == nums[fast-1]){
fast++;
}else{
slow++;
nums[slow] = nums[fast];
fast++;
}
}
return slow+1;
}