package org.example.interview.practice; import java.util.Deque; import java.util.LinkedList; /** * @author xianzhe.ma * @date 2021/8/16 */ public class NC_49_longestValidParentheses { public int longestValidParentheses (String s) { // write code here int maxans = 0; Deque<Integer> stack = new LinkedList<Integer>(); stack.push(-1); for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == '(') { stack.push(i);//放的是左括号的下标 } else { stack.pop();//遇到右括号就pop if (stack.isEmpty()) { stack.push(i);//始终保证栈底是上次未匹配的右括号的下标 } else { maxans = Math.max(maxans, i - stack.peek()); } } } return maxans; } }
package org.example.interview.practice; import java.util.Stack; /** * @author xianzhe.ma * @date 2021/7/16 */ public class NC_50_REVERSE_K_GROUP { public ListNode reverseKGroup(ListNode head, int k) { // write code here Stack<ListNode> stack = new Stack<ListNode>(); //初始化一个新的链表存放结果 ListNode ret = new ListNode(0); //为新链表定义一个指针,防止后续操作改变链表头节点 ListNode p = ret; //循环原有链表 while (true) { //为每次反转计数 int count = 0; //定义指针操作原始链表 ListNode tmp = head; //循环入栈 while (tmp != null && count < k) { stack.push(tmp); tmp = tmp.next; count++; } //判断该次反转是否达到要求,此处防止因tem==null跳出循环的条件 if (count != k) { //表示剩下的节点不够k个,直接将剩余节点插入末尾结束 p.next = head; break; } //出栈操作,反转链表 while (!stack.isEmpty()) { p.next = stack.pop(); p = p.next; } //重置下一次操作的初始节点 p.next = tmp; head = tmp; } return ret.next; } public static class ListNode { int val; ListNode next = null; public ListNode(int val) { this.val = val; } } public static void main (String[] args) { ListNode one = new ListNode(11); ListNode two = new ListNode(22); ListNode three = new ListNode(33); ListNode four = new ListNode(44); ListNode five = new ListNode(55); ListNode six = new ListNode(66); one.next = two; two.next = three; three.next = four; four.next = five; five.next = six; printList(reverseKGroup2(one,2)); } public static void printList(ListNode head) { while (head != null) { System.out.print(head.val + " "); head = head.next; } } public static ListNode reverseKGroup2(ListNode head, int k) { Stack<ListNode> stack = new Stack<>(); ListNode dummy = new ListNode(-1); ListNode p = dummy; while (true) { int count = 0; ListNode temp = head; while (temp!= null && count < k) { stack.push(temp); temp = temp.next; count++; } if (count<k) { p.next = head; break; } while (!stack.isEmpty()) { p.next = stack.pop(); p = p.next; } head = temp; p.next = temp; } return dummy.next; } }