头条-手撕代码

[toc]

图算法

static int[][] a; // 邻接矩阵存储图信息; Integer.MAX_Value代表两个节点不相邻; 0 代表该节点本身,其余值代表路径长度
    private static int n, m;
    
    // 深搜算法,从 u 节点开始遍历;
    void dfs(int u, boolean[] bool) {
        bool[u] = true;
        visit(u);
        for(int i=0; i<n; i++) {
            if(!bool[i] && a[u][i] != Integer.MAX_VALUE) dfs(i, bool);
        }
    }
    
    //广搜算法, 从u节点开始遍历;
    void bfs(int u) {
        boolean[] bool = new boolean[n];
        Queue<Integer> q = new LinkedList<>();
        q.offer(u);
        while(!q.isEmpty()) {
            int v = q.poll();
            bool[v] = true;
            visit(v);
            for(int i=0; i<n; i++) {
                if(!bool[i] && a[v][i] != Integer.MAX_VALUE) q.offer(i);
            }
        }
    }
    
    void visit(int u) {
        System.out.println("遍历到了节点:" + u);
    }
    
    // 拓扑排序算法;
    void topology() {
        int[] num = new int[n];
        for(int i=0; i<n; i++) {
            for(int j=0; j<n; j++) {
                if(a[i][j] != 0 && a[v][i] != Integer.MAX_VALUE) num[j] ++;
            }
        }
        Queue<Integer> q = new LinkedList<>();
        for(int i=0; i<n; i++) {
            if(num[i] == 0) q.offer(i);
        }
        while(!q.isEmpty()) {
            int u = q.poll();
            visit(u);
            for(int i=0; i<n; i++) {
                if(i != u && a[u][i] != Integer.MAX_VALUE && num[i] > 0) {
                    num[i] --;
                    if(num[i] == 0) q.offer(i);
                }
            }
        }
        
    }

以及最短路径算法

void dijkstra(int s, int n) {
    vector<int> dis;
    dis.resize(n+1, maxn);
    dis[s]=0;
    vector<bool> b;
    b.resize(n+1, false);
    for (int i=1; i<=n; i++) {
        int u=-1, min=maxn;
        for (int j=1; j<=n; j++) {
            if (!b[j] && dis[j]<min) {
                min=dis[j];
                u=j;
            }
        }
        if (u==-1) printf("图并非连通...");
        b[u]=true;
        for (int j=1; j<=n; j++) {
            if (dis[u]+a[u][j]<dis[j]) dis[j]=dis[u]+a[u][j];
        }
    }
}

树算法

import java.util.*;

public class Tree {
    class TreeNode {
        int val;
        TreeNode left, right;
        TreeNode(int val) {
            this.val = val;
        }
    }
    
    public static void main(String[] args) {
        int[] a = {4, 2, 6, 1, 3, 5, 7};
        Tree t = new Tree();
        TreeNode root = t.creatTree(a);
        t.after2(root);
    }
    
    TreeNode creatTree(int[] a) {
        if(a == null || a.length == 0) return null;
        TreeNode head = null;
        for (int i = 0; i<a.length; i++) {
            head = insert(head, a[i]);
        }
        return head;
    }
    
    TreeNode insert(TreeNode root, int val) {
        if(root == null) return new TreeNode(val);
        if(val >= root.val) root.right = insert(root.right, val);
        else root.left = insert(root.left, val);
        return root;
    }
    
    void pre(TreeNode root) {
        if (root == null) return;
        Stack<TreeNode> s = new Stack<>();
        s.push(root);
        while(!s.isEmpty()) {
            TreeNode p = s.pop();
            visit(p);
            if(p.right != null) s.push(p.right);
            if(p.left != null) s.push(p.left);
        }
    }
    
    void mid(TreeNode root) {
        if (root == null) return;
        Stack<TreeNode> s = new Stack<>();
        TreeNode p = root;
        while(p != null || !s.isEmpty()) {
            while(p != null) {
                s.push(p);
                p = p.left;
            }
            if(!s.isEmpty()) {
                p = s.pop();
                visit(p);
                p = p.right;
            }
        }
    }
    
    void after(TreeNode p) {
        Stack<TreeNode> stack = new Stack<TreeNode>();  
        TreeNode node = p, prev = p;  
        while (node != null || stack.size() > 0) {  
            while (node != null) {  
                //System.out.println("push:" + node.val);
                stack.push(node);  
                node = node.left;  
            }  
            if (stack.size() > 0) {  
                TreeNode temp = stack.peek().right;  
                if (temp == null || temp == prev) {  
                    //if(temp == null) 
                        //System.out.println("temp = null");
                    //else 
                        //System.out.println("pre=" + prev.val);
                    
                    node = stack.pop();  
                    visit(node);  
                    prev = node;  
                    node = null;  
                } else {  
                    node = temp;  
                }  
            }  
        }  
    }
    
    void after2(TreeNode root) {
        TreeNode p = root;
        Stack<TreeNode> s1 = new Stack<>();
        Stack<TreeNode> s2 = new Stack<>();
        while(p != null || !s1.isEmpty()) {
            while(p != null) {
                s1.push(p);
                s2.push(p);
                p = p.right;
            }
            if(!s1.isEmpty()) {
                p = s1.pop();
                p = p.left;
            }
        }
        while(!s2.isEmpty()) {
            p = s2.pop();
            visit(p);
        }
    }
    
    void visit(TreeNode r) {
        System.out.println("visit:" + r.val);
    }
    
    
}

手写LRU

package com.gastby.utils;
import java.util.*;

public class MyLRUCache<K, V> {
    
    class CacheNode {
        Object key;
        Object value;
        CacheNode pre, next;
        CacheNode(Object key, Object o) {
            this.key = key;
            value = o;
        }
        public String toString() {
            return "key:" + key + ", value:" + value;
        }
    }
    
    private CacheNode head, tail;
    private HashMap<K, CacheNode> map;
    private int MaxSize;
    
    MyLRUCache(int n) {
        MaxSize = n;
        map = new HashMap<>();
    }
    
    public void put(K key, V value) {
        CacheNode node = map.get(key);
        if(node == null) {
            if(map.size() >= MaxSize) {
                map.remove(tail.key);
                removeTail();
            }
            node = new CacheNode(key, value);
            map.put(key, node);
        }
        moveToHead(node);
    }
    
    public Object get(K key) {
        CacheNode node = map.get(key);
        if (node == null) return null;
        moveToHead(node);
        return node.value;
    }
    
    public void moveToHead(CacheNode node) {
        if(node == head) return;
        if(node.pre != null) node.pre.next = node.next;
        if(node.next != null) node.next.pre = node.pre;
        if(node == tail) tail = tail.pre;
        if(head == null) {
            head = tail = node;
            return;
        }
        node.next = head;
        head.pre = node;
        head = node;
        head.pre = null;
    }
    
    public Object delete(K key) {
        CacheNode node = map.get(key);
        if(node  == null) return null;
        if(node.pre != null){
            node.pre.next=node.next;
        }
        if(node.next != null){
            node.next.pre=node.pre;
        }
        if(node == head){
            head = node.next;
        }
        if(node == tail){
            tail = node.pre;
        }
        map.remove(key);
        return node.value;
    }
    
    public void removeTail() {
        if (tail != null) {
            map.remove(tail.key);
            tail = tail.pre;
            if (tail == null) {
                head = null;
            } else {
                tail.next = null;
            }
        }
    }
    
    public int getSize() {
        return map.size();
    }
    
    public void showNodes() {
        CacheNode p = head;
        while(p != null) {
            System.out.print(p + ",");
            p = p.next;
        }
        System.out.println();
    }
    
    public static void main(String[] args) {
        MyLRUCache<Integer, String> m = new MyLRUCache<>(5);
        m.put(1, "tom");
        m.put(2, "july");
        m.put(3, "lily");
        m.put(4, "sandy");
        m.put(5, "peter");
        m.showNodes();
        m.get(3);
        m.showNodes();
        m.put(6, "jane");
        m.showNodes();
        m.delete(3);
        m.showNodes();
        m.removeTail();
        m.showNodes();
    }

}

排序算法

//快速排序,k从0到a.lenght-1取值;
//利用快排思想找第k个数字,在内部排好序了,直接取值a[k]即可;
    void quickSort(int[] a, int k) {
        int l=0, r = a.length-1;
        while (l < r) {
            int j = patition(a, l, r);
            if (k == j) break;
            else if (k < j) r = j - 1;
            else l = j + 1;
        }
    }

    int patition(int[] a, int l, int r) {
        int p = a[r], index = l - 1;
        for (int i=l; i<r; i++) {
            if (a[i] < p) {
                int temp = a[++index];
                a[index] = a[i];
                a[i] = temp;
            }
        }
        int temp = a[++index];
        a[index] = a[r];
        a[r] = temp;
        return index;
    }

        void heapSort(int[] a) {
        int n = a.length-1;
        for (int i=n; i>0; i--) {
            int temp = a[0];
            a[0] = a[i];
            a[i] = temp;
            sink(a, 0, i-1);
        }
    }
    
    void createHeap(int[] a) {
        int k = a.length/2-1;
        for (int i=k; i>=0; i--) {
            sink(a, i, a.length-1);
        }
    }
    
    void sink(int[] a, int i, int n) {
        int l = 2*(i+1)-1, r = 2*(i+1), max = i;
        if (l<= n && a[l] > a[i]) {
            max = l;
        }
        if (r<= n && a[r] > a[max]) {
            max = r;
        }
        if (max != i) {
            int temp = a[i];
            a[i] = a[max];
            a[max] = temp;
            sink(a, max, n);
        }
    }


链表算法

public class Main{
    public static void main(String[] args) {
        int[] a = {1, 4, 4, 4, 13, 13, 24, 35};
        Node root = create(a);
        print(root);
        root = clearDuplicate(root);
        print(root);
    }
    
    static void print(Node root) {
        Node p = root;
        while (p != null) {
            System.out.print(p.val + " ");
            p = p.next;
        }
        System.out.println();
    }
    // 创建一个链表
    static Node create(int[] a) {
        Node head = null, p = head;
        for(int i=0; i<a.length; i++) {
            Node temp = new Node(a[i]);
            if(p == null) {
                p = temp;
                head = p;
            } else {
                p.next = temp;
                p = p.next;
            }
        }
        return head;
    }
    
 Node paritialReverse(Node head, int start, int end) {
        if(start < 1 || start >= end || head == null) return head;
        Node fakeHead = new Node(-1);
        fakeHead.next = head;
        int i = 0;
        Node p = fakeHead, q = p;
        while(i < start-1 && p != null) {
            if(p.next == null) return fakeHead.next;
            p = p.next;
            i ++;
        }
        i = 0;
        while(i < end && q != null) {
            if(q.next == null) break;
            q = q.next;
            i ++;
        }
        Node temp = q.next;
        q.next = null;
        q = temp;
        p.next = reverse(p.next);
        while(p.next != null) p = p.next;
        p.next = q;
        return fakeHead.next;
    }

    // 逆转链表
    static Node reverse(Node root) {
        Node p = root, q = null, r;
        while(p != null) {
            r = q;
            q = p;
            p = p.next;
            q.next = r;
        }
        return q;
    }

    // sort two sorted linkedlist to one linkedlist;
    static Node compute(Node r1, Node r2) {
        Node head = new Node(-1), p = head;
        while(r1 != null || r2 != null) {
            if(r1 == null) {
                p.next = r2;
                break;
            } else if(r2 == null) {
                p.next = r1;
                break;
            } else {
                if (r1.val < r2.val) {
                    p.next = r1;
                    r1 = r1.next;
                } else {
                    p.next = r2;
                    r2 = r2.next;
                }
                p = p.next;
                p.next = null;
            }
        }
        return head.next;
    }

    // remove all the duplicated elements to make sure the number is 1;
    static Node deleteDuplicate(Node root) {
        if(root == null) return root;
        Node temp = root;
        Node p = temp.next;
        while(p != null) {
            if(p.val == temp.val) {
                while(p != null && p.val == temp.val) p = p.next;
                temp.next = p;
                if(p == null) return root;
                temp = temp.next;
            } else {
                temp = p;
            }
            p = p.next;
        }
        return root;
    }
    
    // remove all the elements whose numbers is more than once; 
    static Node clearDuplicate(Node root) {
        if(root == null) return root;
        Node head = new Node(-1);
        Node p = head, temp = root;
        while(temp != null) {
            if(temp.next == null || temp.next.val != temp.val) {
                p.next = temp;
                p = p.next;
                temp = temp.next;
                p.next = null;
            } else {
                while (temp.next != null && temp.next.val == temp.val) temp = temp.next;
                temp = temp.next;
            }
        }
        return head.next;
    }
    
    //复制任意链表节点
    static RandomListNode Clone(RandomListNode head) {
        if(head == null) return head;
        RandomListNode r = head;
        while (r != null) {
            RandomListNode temp = new RandomListNode(r.label);
            temp.next = r.next;
            r.next = temp;
            r = temp.next;
        }
        r = head;
        while(r != null) {
            RandomListNode clone = r.next;
            if(r.random != null)
                clone.random = r.random.next;
            r = clone.next;
        }
        r = head;
        RandomListNode clone = head.next;
        while(r.next != null) {           
            RandomListNode next = r.next;
            r.next = next.next;
            r = next;            
        }
        return clone;
    }
    
    

}

class RandomListNode {
    int label;
    RandomListNode next = null;
    RandomListNode random = null;

    RandomListNode(int label) {
        this.label = label;
    }
}

class TreeNode {
    int val;
    TreeNode left, right;
    TreeNode(int val) {
        this.val = val;
    }
}

class Node {
    int val;
    Node next;
    Node(int val) {
        this.val = val;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容