链表题 面试题02.04. 分割链表290. 单词规律20. 有效的括号

Posted 王嘻嘻-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表题 面试题02.04. 分割链表290. 单词规律20. 有效的括号相关的知识,希望对你有一定的参考价值。

目录

面试题02.04. 分割链表

290. 单词规律

20. 有效的括号


面试题02.04. 分割链表

package leetcode;

//分割链表给你一个链表的头节点 head 和一个特定值 x ,
// 请你对链表进行分隔,使得所有 小于 x 的节点都出现在
// 大于或等于 x 的节点之前。
public class interview02_04 
    public ListNode partition(ListNode head, int x) 
        ListNode smallHead = new ListNode(-1);
        ListNode smallTail = smallHead;
        ListNode bigHead = new ListNode(-1);
        ListNode bigTail = bigHead;
        //边界条件
        if (head == null)
            return null;
        
        while (head!=null)
            if (head.val<x)
                //小链表 尾插
                smallTail.next=head;
                smallTail=head;
            else
                //大链表 尾插
                bigTail.next=head;
                bigTail=head;
            
            head = head.next;
        
        //将大链表拼接到小链表后边
        bigTail.next=null;
        smallTail.next=bigHead.next;
        return smallHead.next;
    

290. 单词规律

用哈希表解决此题,对照题目的要求,第一个字符串的格式是abba型或者其他类型,判断第二个字符串为此类型。
1.创建第一个HashMap为map1,key值存放character-a,value值存放List-a出现的位置
2.将第二个字符串按照空格切分,存放到数组中,创建第二个HashMap。key值存放string-dog,value值与步骤一相同
3.判断第一个字符串的长度与步骤二创建的数组长度是否一致,不一致直接返回false,反之继续
4.循环中将字符串与数组添加到两个map中,同时判断两个value的值是否相同,如果不同直接返回false;
5.循环结束代表两个map对应value值都相同,返回true.

class Solution 
    public  boolean wordPattern(String pattern, String s) 
        String[] strings = s.split(" ");

        if (strings.length!=pattern.length())
            return false;
        
        
        Map<Character, List<Integer>> map = new HashMap<>();
        
        Map<String ,List<Integer>> map2 = new HashMap<>();

        for (int i = 0; i < pattern.length(); i++) 
            char c = pattern.charAt(i);
            if (map2.get(strings[i])!=null)
                List<Integer> list = map2.get(strings[i]);
                list.add(i);
                map2.put(strings[i],list);
            else
                List<Integer> list = new ArrayList<>();
                list.add(i);
                map2.put(strings[i],list);
            
            
            if (map.get(c)!=null)
                List<Integer> list = map.get(c);
                list.add(i);
                map.put(c,list);
                if (map.get(c).equals(map2.get(strings[i]))==false)
                    return false;
                
            else 
                List<Integer> list1 = new ArrayList<>();
                list1.add(i);
                map.put(c,list1);
                if (map.get(c).containsAll(map2.get(strings[i]))==false)
                    return false;
                
            
        
        return true;
    

20. 有效的括号

class Solution 
    public boolean isValid(String s) 
        Stack<Character> stack = new Stack<>();
        //将字符串转为字符输出
        for (int i = 0; i < s.length(); i++) 
            char c = s.charAt(i);
            //碰到左括号直接入栈
            if (c == '' || c == '[' || c == '(')
                stack.push(c);
            else 
                //此时是个右括号
                if (stack.isEmpty())
                    //右括号是第一个字符,没有相应的左括号与之匹配,返回false
                    return false;
                
                //弹出左括号
                char top = stack.pop();
                if (c == ')' && top != '(')
                    return false;
                
                if (c == ']' && top != '[')
                    return false;
                
                if (c == '' && top != '')
                    return false;
                
            
        
        //此时字符串已经扫描完毕,判断当前栈中是否为空
        return stack.isEmpty();
    

本小节完^_^

以上是关于链表题 面试题02.04. 分割链表290. 单词规律20. 有效的括号的主要内容,如果未能解决你的问题,请参考以下文章

程序员面试金典-面试题 02.04. 分割链表

程序员面试金典面试题 02.04. 分割链表

Leetcode刷题笔记之链表篇面试题 02.04. 分割链表

Leetcode刷题笔记之链表篇面试题 02.04. 分割链表

通过这6道初级链表题检验你的链表知识是否合格

《手撕链表题系列-7》链表的回文结构