有效的括号

力扣——20. 有效的括号

思路:

  • 定义一个栈用来存储左括号
  • 定义一个字典,用来存放键值对右括号->左括号
  • 循环遍历s中的括号,左括号存入栈中
  • 当遇到第一个右括号时,我们可以判断它的左边一定是一个左括号
  • 这时就把栈顶左括号与map中的右括号对应值比较(并且比较后要把这个元素推出栈,可以保证下一个左括号仍然对应右括号)
    image
点击查看所有代码
import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
public class isValid {
    public boolean isValid(String s) {
    /*    Stack<Character> stack=new Stack<Character>();
        char[] chars=s.toCharArray();
        for (int i = 0; i < chars.length/2; i++) {
            stack.push(chars[i]);
        }
        HashMap<Character,Character> map=new HashMap<>();
        map.put('(',')');
        map.put('[',']');
        map.put('{','}');
        boolean isFlag=true;
        for (int i = chars.length/2; i < chars.length; i++) {
            if(chars[i]!=map.get(stack.pop())){
                isFlag=false;
            }
        }
        return isFlag;*/
        int n = s.length();
        if (n % 2 == 1) return false;
        //这里定义一个字典,用来存放键值对右括号->左括号
        Map<Character, Character> map = new HashMap<>();
        map.put(')', '(');
        map.put('}', '{');
        map.put(']', '[');
        Deque<Character> stack = new LinkedList<>();
        for (char ch : s.toCharArray()) {
            //循环遍历s中的括号,左括号存入栈中
            //当遇到第一个右括号时,我们可以判断它的左边一定是一个左括号
            //这时就把栈顶左括号与map中的右括号对应值比较(并且比较后要把这个元素推出栈)
            if(map.containsKey(ch)){
                //这里判断栈为空可以减少计算的次数,提高效率
                if(stack.peek()!=map.get(ch)||stack.isEmpty()) {
                    return false;
                }
                stack.pop();
            }else{
                stack.push(ch);
            }
        }
        //注意为栈可能为空!!!
        return stack.isEmpty();
    }
}

有效的括号

力扣——61.旋转链表

思路:

  1. 得到链表长度,同时让最后一个节点指向头节点将链表连接成一个环
ListNode node=head;
        int size=1;//链表长度
        while (node.next!=null){//得到链表长度,并将node指向最后一个节点
            node=node.next;
            size++;
        }
  1. 接下来回到头节点,得到走了k步之后的链表尾节点(size-k%size-1)
 //走了k步之后链表的最后一个节点应该是size-k%size-1(对于环的问题经常用到mod)
        for (int i = 0; i <size-k%size-1; i++) {
            head=head.next;
        }
  1. 断开尾节点,返回头节点
  node=head;
        head=head.next;
        node.next=null;
        return head;
点击查看代码
public class rotateRight {
    public ListNode rotateRight(ListNode head, int k) {
        if(head==null||head.next==null)return head;
        ListNode node=head;
        int size=1;//链表长度
        while (node.next!=null){//得到链表长度,并将node指向最后一个节点
            node=node.next;
            size++;
        }
        node.next=head;//将链表连成一个环
        //走了k步之后链表的最后一个节点应该是size-k%size-1(对于环的问题经常用到mod)
        for (int i = 0; i <size-k%size-1; i++) {
            head=head.next;
        }
        node=head;
        head=head.next;
        node.next=null;
        return head;
    }
}
posted @ 2021-11-01 21:40  Jyang~  阅读(79)  评论(0)    收藏  举报