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

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

作者: 花醉霜寒 | 来源:发表于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