力扣刷题day02

力扣刷题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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值