美文网首页
常见面试算法题整理(持续更新中)

常见面试算法题整理(持续更新中)

作者: 花醉霜寒 | 来源:发表于2020-09-07 17:17 被阅读0次

    \color{green}{手写LRU}

    public class LRUCache<K,V> extends LinkedHashMap<K,V> {
    
        int maxSize = 50;
    
        Lock lock = new ReentrantLock();
    
        public LRUCache(int initialCapacity, float loadFactor, boolean accessOrder, int maxSize) {
            super(initialCapacity, loadFactor, accessOrder);
            this.maxSize = maxSize;
        }
    
        @Override
        protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
            return this.size() > maxSize;
        }
    
        public V get(Object key) {
            try {
                lock.lock();
                return super.get(key);
            } finally {
                lock.unlock();
            }
        }
    
        public V put(K key, V value) {
            try {
                lock.lock();
                return super.put(key, value);
            } finally {
                lock.unlock();
            }
        }
    }
    

    \color{green}{两个线程交替打印1到100}

    public class ThreadTest {
    
        final static AtomicInteger flag = new AtomicInteger(1);
        static Object lock = new Object();
        static int i = 1;
    
        public static void main(String[] args) {
            Thread thread1 = new Thread(() -> {
                while(i <= 100) {
                    synchronized (lock) {
                        lock.notify();
                        if(i % 2 != 0) {
                            System.out.println("thread1:" + i++);
                        } else {
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            });
    
            Thread thread2 = new Thread(() -> {
                while(i <= 100) {
                    synchronized (lock) {
                        lock.notify();
                        if(i % 2 == 0) {
                            System.out.println("thread2:" + i++);
                        } else {
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            });
            thread1.start();
            thread2.start();
        }
    }
    

    \color{green}{二叉树层序遍历}

    /**
    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
    }
    **/
    
    
    public class BinaryLayerSout {
        public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
            if(root == null) return new ArrayList<>();
            LinkedList<TreeNode> stack = new LinkedList<>();
            ArrayList<ArrayList<Integer>> res = new ArrayList<>();
            stack.addLast(root);
            while (!stack.isEmpty()) {
                int size = stack.size();
                ArrayList<Integer> temp = new ArrayList<>(size);
                while(size-- > 0) {
                    TreeNode tempNode = stack.pollFirst();
                    temp.add(tempNode.val);
                    if(tempNode.left != null) {
                        stack.addLast(tempNode.left);
                    }
                    if(tempNode.right != null) {
                        stack.addLast(tempNode.right);
                    }
                }
                res.add(temp);
            }
            return res;
        }
    }
    

    \color{green}{合并有序链表}

    /**
    @Data
    public class ListNode {
        int val;
        ListNode next;
    }
    **/
    
    public class MergeSortedLinkedList {
    
        public ListNode mergeSortedLinkedList(ListNode head1, ListNode head2) {
            if(null == head1) return head2;
            if(null == head2) return head1;
            ListNode mergeNode = new ListNode();
            ListNode p = mergeNode;
            while(head1 != null && head2 != null) {
                if(head1.val <= head2.val) {
                    p.next = head1;
                    p = p.next;
                    head1 = head1.next;
                } else {
                    p.next = head2;
                    p = p.next;
                    head2 = head2.next;
                }
            }
            if(head1 != null) {
                p.next = head1;
            }
            if(head2 != null) {
                p.next = head2;
            }
            return mergeNode.next;
        }
    }
    

    \color{green}{快速排序}

    public class QuickSort {
    
        public static void main(String[] args) {
            int[] array = {7,6,5,4,3,2,1,6};
            sort(array, 0, array.length - 1);
            System.out.println(Arrays.toString(array));
            System.out.println(1 >> 1);
        }
    
        public static void sort(int[] array, int beginIndex, int endIndex) {
            if(beginIndex >= endIndex) {
                return;
            }
            int partition = partition(array, beginIndex, endIndex);
            sort(array, beginIndex, partition - 1);
            sort(array, partition + 1, endIndex);
        }
    
        public static int partition(int[] array, int beginIndex, int endIndex) {
            int pivot = array[endIndex];
            int index = beginIndex;
            for(int i = beginIndex; i < endIndex; i++) {
                if(array[i] < pivot) {
                    int temp = array[i];
                    array[i] = array[index];
                    array[index] = temp;
                    index++;
                }
            }
            int temp = array[endIndex];
            array[endIndex] = array[index];
            array[index] = temp;
            return index;
        }
    }
    

    \color{green}{链表环问题}

    public class CycleInLinkedList {
    
        /**
         * 验证链表是否有环
         * @param head
         * @return
         */
        public boolean hasCycle(ListNode head) {
            if(null == head) return false;
            ListNode slow = head;
            ListNode fast = head;
            while(fast != null && fast.next != null) {
                slow = slow.next;
                fast = fast.next.next;
                if(slow == fast) {
                    return true;
                }
            }
            return false;
        }
    
    
        /**
         * 寻找链表中的环入口
         * @param head
         * @return
         */
        public ListNode findEntryNodeOfCycle(ListNode head) {
            if(null == head) return null;
    
            ListNode slow = head;
            ListNode fast = head;
            while(fast != null && fast.next != null) {
                slow = slow.next;
                fast = fast.next.next;
                if(slow == fast) {
                    slow = head;
                    while(slow != fast) {
                        slow = slow.next;
                        fast = fast.next;
                    }
                    break;
                }
            }
    
            if(fast == null || fast.next == null) return null;
            return slow;
        }
    }
    

    相关文章

      网友评论

          本文标题:常见面试算法题整理(持续更新中)

          本文链接:https://www.haomeiwen.com/subject/exslektx.html