算法第四版笔记(一)

  一开始看这本书的目录发现连动态规划都没有的,当时觉得有点坑爹,后来想想我这种基础烂到家的码畜也没什么资格觉得这玩意儿能坑爹。
  断断续续的看到现在其实做了第一章的数据结构的链表背包题目,发现其实书上讲的挺多的,题目大多都是让自己构造一个简单的容器,实现API。
  除了书上的题目,对于链表的练习这里推荐几个LeetCode里面的题目,都是仅与链表本身操作相关,不涉及其他算法。

2. Add Two Numbers
19. Remove Nth Node From End of List
82. Remove Duplicates from Sorted List II
86. Partition List
19. Remove Nth Node From End of List
25. Reverse Nodes in k-Group
  做链表题感觉最需要注意的就是NullPointException,如果能在循环里规避就最好了,实在不行呢,在循环里面写个判断。最开始甚至写过while(node!=null){if(node.next.val!=1){}}这样的蠢东西。

1.几个简单的算法

1.1翻转链表

//其实很简单,主要致敬一下轮子哥之前的一个回答= =
//第一个方法是:一个个遍历链表,并且将节点插入新链表头
Node reserves(Node node){
     Node first = node;
     Node temp = null;
     while(first!=null){
        Node next = first.next;
        first.next = temp;
        temp = first;
        first = next;
    }
    return temp;
}
//第二个方法是:一个个将链表中的节点倒转
//1->2->3->4->5 => 2->1->3->4->5这样的
Node reserves(Node node){
     Node current= node;
     Node temp= node;
     while(current.next!=null){
        Node second = current.next;
        current.next = second.next;
        second.next = temp;
        temp = second;
    }
    return temp;
}

反正个人觉得链表的东西就是疯狂创建指针就完事儿了(似乎还专门有种说法叫双指针?)。更多的练习可以上leetcode去专门找linked list做。

1.2随机选取

书上某一题需要用数组实现一个随机队列其中一个接口要求随机返回并删除某一个元素,但是书上又没有现成方法咯。不过也很简单,就是从队列中随机取一个随机数据然后与尾数据交换,然后删除尾数据,用random类实现。

 int[] a = new int[]{1,2,3,4,5,6,7,8,9,0};
       int size = a.length;
       while (size!=0){ 
           int index = (int)(Math.random()*size);
           int temp = a[index];
           a[index] = a[--size];
           a[size] = temp;
           System.out.println(temp);
       }

1.3栈的可生成性

emmmmmm,常见题了吧...就是给一个栈的操作(可能是pop也可能是push)序列,以及几串结果,问你下列几个结果哪个是生成不了的。就是 1-2-3-4-5的栈操作顺序问你5-4-1-2-3是不是可生成。

//将结果与操作逐个比对,如果有相同,则当成一个入栈出栈操作,跳过,否则将操作数压入栈
//最后栈不断pop并与剩余数比较,有不同则错。
//发现我怎么说都说不拎清,还是看代码吧....反正也简单
 LinkedList<Integer> linkedList = new LinkedList<>();
        int[] a = new int[]{1,2,3,4,5};
        int[] b = new int[]{5,4,3,2,1};
        int i=0,j=0;
        while (i<a.length&&j<b.length){
            if (a[i]!=b[j]){
                linkedList.push(a[i++]);
            }
            else {
                j++;i++;
            }
        }
        while (j<b.length){
            if (linkedList.pop()!=b[j]){
                break;
            }
            j++;
        }
        System.out.println(linkedList.isEmpty());

2.构造数据结构以及一点点问题

首先自己实现数据结构API刚好书上有一套组合题。
1:实现双向队列。2:用双向队列实现两个栈。3:用两个栈实现一个缓冲区API。
说实话这些题目看着挺简单的,但是其中有很多值得思考的地方。

public class DulNode<T> {

    T item;
    DulNode<T> next;
    DulNode<T> pre;

    public DulNode(T item) {
        this.item = item;
    }
    public DulNode(){}
}

//双向队列实现俩栈
public class DequeImp<Item> implements Deque<Item> {

    private int size = 0;

    private DulNode<Item> root = new DulNode<>();


    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public void pushLeft(Item item) {
        DulNode<Item> temp = root;
        while (temp.pre != null) {
            temp = temp.pre;
        }
        DulNode<Item> left = new DulNode<>(item);
        temp.pre = left;
        left.next = temp;
        size++;
    }



    @Override
    public void pushRight(Item item) {
        DulNode<Item> temp = root;
        while (temp.next != null) {
            temp = temp.next;
        }
        DulNode<Item> right = new DulNode<>(item);

        temp.next = right;
        right.pre = temp;
        size++;
    }



    @Override
    public Item popLeft() {
        DulNode<Item> temp = root;
        if (temp.pre == null) {
            return null;
        }
        while (temp.pre != null) {
            temp = temp.pre;
        }
        Item result = temp.item;
        temp.next.pre = null;
        size--;
        return result;
    }



    @Override
    public Item popRight() {
        DulNode<Item> temp = root;
        if (temp.next == null) {
            return null;
        }
        while (temp.next!=null) {
            temp = temp.next;
        }
        Item result = temp.item;
        temp.pre.next = null;
        size--;
        return result;
    }

}

public class BufferImp implements Buffer{
    private DequeImp<Character> stack;


    public BufferImp(){
          stack = new DequeImp<>();
    }

    @Override
    public void insert(char c) {
        stack.pushLeft(c);
    }

    @Override
    public char delete() {
        //这里有个问题,基础的char无法为null,但是容器又是泛型的
        // 所以具体应该如何处理不抛出null的异常,有什么好的解决办法?
        Character result = stack.popLeft();
        return result==null?'\0':result;
    }

    @Override
    public void left(int k) {
        if (checkSize(k)){
            while (k>0){
                stack.pushRight(stack.popLeft());
                k--;
            }
        }
    }

    @Override
    public void right(int k) {
        if (checkSize(k)){
            while (k>0){
                stack.pushLeft(stack.popRight());
                k--;
            }
        }
    }

    @Override
    public int size() {
        return stack.size();
    }
    private boolean checkSize(int k){
        if (size()<k){
            System.out.println("can not do this operation");
            return false;
        }
        return true;
    }
}

其实非常建议看看JDK的容器代码,写得好而且代码文档详细,看着好舒服= =。

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

推荐阅读更多精彩内容