算法学习---逻辑和链表

今天特别想叹气一下! 感觉自己会的实在是太少太少了!

今天我们的柱大神,看到我看算法的书,说了一句,你刚刚开始看啊?然后又说了一句算法是有天分的人才能会的!

是啊,刚刚开始看,真后悔大学时候干嘛去了,没有实习没有啥的,就知道那看视频,学api,怪不得原来面试各种被鄙视。

算了! 只能笑笑对着自己说! whatever 我还年轻! 对吧! 只要开始了就不晚!

强强大神一句话点醒了我,工业化的时代,熟练工种的学习,做业务确实不需要什么算法,但是如果选择了另外一条路,算法就是必不可少的!

就算是一个普通程序员的积累也好啊!


努力不一定成功! 但放弃一定失败! 相信自己每天进步着,我会厉害起来的!(希望3年后我再看到自己写的这句话,然后在后面加一句!你是对的!)(就在这个括号里面哦!)


哈哈 言归正传

昨天晚上学习了,书里面的一套逻辑,其实在我看来就是一个关于栈使用的小模型,两个人交替出牌,最后看谁的牌先出完(描述的太简单了),其实就是拉大车,哈哈!

 public static void main(String[] args){
        long startTime = System.currentTimeMillis();
        System.out.println("main 方法开始");

        // 初始化 两个人的扑克牌 , 和一个扑克牌桌子
        ArrayPoker game1 = new ArrayPoker();
        ArrayPoker game2 = new ArrayPoker();
        int [] game1Poker = {2,4,1,2,5,6};
        int [] game2Poker = {3,1,3,5,6,4};
//        int[] game1Poker = {2,3,7};
//        int[] game2Poker = {1,4,2};
        for (int i = 0; i < game1Poker.length; i++) {
            game1.pokerArray[i] = game1Poker[i];
            game1.tail = game1Poker.length;

            game2.pokerArray[i] = game2Poker[i];
            game2.tail = game2Poker.length;
        }
        // 初始化栈队列
        StackPoker stackPoker = new StackPoker();

        while(game1.head != game1.tail && game2.head != game2.tail){
            // 第一个人先开始
            palyPoker(stackPoker,game1);
            printArray(game1,"第一个人");
            if(checkWin(game1)){
                System.out.println("第一个人获得了胜利!");
                break;
            }
            // 第二个人再开始
            palyPoker(stackPoker,game2);
            printArray(game2,"第二个人");
            if(checkWin(game2)){
                System.out.println("第二个人获得了胜利!");
                break;
            }
            printStack(stackPoker);
        }

        System.out.println("main 方法结束 耗时:" + (System.currentTimeMillis() - startTime) +" ms!");
    }

    /**
     * 两个人进行交互,都是往stackPoker里面进行出牌,然后谁先出完了 谁赢
     * @param stackPoker
     * @param arrayPoker
     */
    public static void palyPoker(StackPoker stackPoker, ArrayPoker arrayPoker){
        // 准备第一个要出的牌
        int pokerNum = arrayPoker.pokerArray[arrayPoker.head];
        int stacknum = -1;
        // 判断是否在牌面上有重合的牌
        for(int i =0;i<stackPoker.stackTop;i++){
            if(stackPoker.pokerNum[i] == pokerNum){
                stacknum = i;
                break;
            }
        }
        // 如果有嬴牌 就进行如下的操作
        if(stacknum != -1){
            arrayPoker.head++;
            arrayPoker.pokerArray[arrayPoker.tail]  = pokerNum;
            arrayPoker.tail++; // 向后移动
            for(;(stackPoker.stackTop-1)>=stacknum;){
                stackPoker.stackTop--;
                arrayPoker.pokerArray[arrayPoker.tail++] = stackPoker.pokerNum[stackPoker.stackTop];
            }
            System.out.println();
//            stackPoker.stackTop++;

        }else{
            arrayPoker.head++;
            stackPoker.pokerNum[stackPoker.stackTop++] = pokerNum;
        }
    }

    /**
     * 打印当前的牌
     * @param arrayPoker
     */
    public static void printArray(ArrayPoker arrayPoker,String name){
        System.out.print(name+" 的手牌为 : ");
        for(int i = arrayPoker.head;i < arrayPoker.tail;i++){
            System.out.print(arrayPoker.pokerArray[i]+",");
        }
        System.out.println("");
    }

    /**
     * 打印当前栈
     * @param stackPoker
     */
    public static void printStack(StackPoker stackPoker){
        System.out.print("当前牌面还剩下 : ");
        for(int i= stackPoker.stackTop -1;i >= 0;i--){
            System.out.print(stackPoker.pokerNum[i]+",");
        }
        System.out.println();
    }

    /**
     * 查看那个获得了胜利
     * @param arrayPoker
     * @return
     */
    public static boolean checkWin(ArrayPoker arrayPoker){
        if(arrayPoker.head == arrayPoker.tail) {
            return true;
        }
        return false;

    }
感觉以上的代码里面比较头痛的就是,嬴牌后栈里面的元素进行添加到后面这个操作了,经常是outofindex的Exception 最后发现还是自己的想法不够好,最后使用了那种方式进行比较,比较的时候栈顶元素本来就是一个null,必须到下一个地点后才能进行比较,但是这样呢,又会造成最后一次比较0的时候0--,变成-1最后如上进行解决了!

感觉很潦草啊! 可能因为这个是一个练习,确实感觉自己还没有完全的领会其中的精髓,不过感觉自己的逻辑方面慢慢的在提升了,至少慢慢知道一个方法干一件事情,这要是以前! 呵呵了! 自己都不认得自己写的,更加不敢拿出来献丑了!


今天晚上加班学了学,链表,原来觉得链表确实没有什么啊! 重来在写代码的时候就知道 List<String> strList = new ArrayList<String>();  当然基本上没有使用过什么链表,不过呢,今天了解到了,链表的好处,就是进行插入的速度非常快啊,如果是一个普通的队列,中间插入一个元素,后需要将中间以后的所有元素向后移动一个位置,这样的话,就是说需要移动n/2-1次,这样的开销,如果是一个超级大的list,可想而知,所以使用了链表元素。开销超级小,不需要进行移动,只需要进行赋值一下就好了。


public static void main(String[] args){
        long startTime = System.currentTimeMillis();
        System.out.println("main 方法开始");

        int[] intArray = {1,3,4,5,6,7,26,44,66,77};
        LinkedListStruct linkedListStruct = new LinkedListStruct();
        for(int i=0;i<intArray.length;i++){
            linkedListStruct.data[i] = intArray[i];
            linkedListStruct.right[i] = i+1;
            linkedListStruct.length++;
        }
        printLinkedListArray(linkedListStruct);
        addNumLinkedListArray(linkedListStruct,6,8);
        printLinkedListArray(linkedListStruct);

        System.out.println("main 方法结束 耗时:" + (System.currentTimeMillis() - startTime) +" ms!");
    }

    /**
     * 按照链表的结构打印出链表
     * @param linkedListStruct
     */
    public static void printLinkedListArray(LinkedListStruct linkedListStruct){
        int index = 0 ;
        // 获取坐标,这个index相当于是right数组中的数据,里面是下一个要打印的结果
        while(linkedListStruct.data[index] != 0){ // 这个循环条件容易出现死循环
            System.out.print(linkedListStruct.data[index] +" , ");
            index = linkedListStruct.right[index];
        }
        System.out.println();
    }

    /**
     * 在链表中某个数字前加入一个数 (感觉这个需求很少啊!知道了那个数再加? 额!)
     * @param linkedListStruct
     * @param number 比对的数字
     * @param addNum 添加的数字
     */
    public static void addNumLinkedListArray(LinkedListStruct linkedListStruct,int number,int addNum){
        for(int i =0;i<linkedListStruct.length;i++){
            // 如果找到那个数字后
            if(linkedListStruct.data[i] == number){
                // 第一步 将添加的数据填入到数组中
                linkedListStruct.data[linkedListStruct.length] = addNum;
                // 第二部将被添加数前面的 right设置成为自己的right
                linkedListStruct.right[linkedListStruct.length] =linkedListStruct.right[i-1];
                // 第三部将被添加数的的下一个right 设置为自己
                linkedListStruct.right[i-1] = linkedListStruct.length;
                // 要把这个添加这个数的前面的right设置为
                linkedListStruct.right[linkedListStruct.length -1 ] = linkedListStruct.length + 1;
                linkedListStruct.length++;
                break;
            }
        }
//        System.out.println("没有找到对应的数字!");
    }
代码写的还是比较丑,慢慢提升吧! 中间打印链表的时候,书上写的是index !=0的时候继续,但是我这个默认就是0啊,作者都是从1开始,不管什么,哈哈! 可能他也有它的写法把! 从0开始毕竟要考虑好多! 

慢慢的感觉自己的逻辑清楚了,希望可以越来越厉害!加油!

明天步入新的一章喽!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值