2018 11 10 ARTS(4)

what?什么是ARTS

  • Algorithm:每周至少做一个leetcode的算法题;
  • Review:阅读并点评至少一篇英文技术文章;
  • Tip/Techni:学习至少一个技术技巧;
  • Share:分享一篇有观点和思考的技术文章;

Algorithm:每周至少做一个leetcode的算法题

541bc93f5c4a2a6e565bcea3b7ff7df3f07.jpg

b467d80862abcf4ea57cb7cf646ca1bc918.jpg

2cf2b2acea37ebf6fd1cafbe2ca88003aec.jpg

规则就是如果你只能在 如果你在1 的话,那么你只能走到6和8, 如果你在2的话,那么你只能走7和9,根据棋盘的规则就是这样。

目前为止还没写出一个不错的解答,原来答案用了回溯递归,然后就在输入161的时候时间超出限制了,后来想了想应该是思路错了,这个用动态规划,时间才够用。

public int knightDialerSolution(int n) {
        int mod = 1000000000 + 7;
        int result = 0;
        for (int i = 0; i < 10; i++) {
            result = pathSum(i, n, result);
        }
        return result % mod;
    }

    public int pathSum(int tempI, int pathNum, int tempResult) {
        if (pathNum == 1) {
            tempResult++;
            return tempResult;
        }
        switch (tempI) {
            case 0:
                tempResult = pathSum(4, pathNum - 1, tempResult);
                tempResult = pathSum(6, pathNum - 1, tempResult);
                break;
            case 1:
                tempResult = pathSum(6, pathNum - 1, tempResult);
                tempResult = pathSum(8, pathNum - 1, tempResult);
                break;
            case 2:
                tempResult = pathSum(7, pathNum - 1, tempResult);
                tempResult = pathSum(9, pathNum - 1, tempResult);
                break;
            case 3:
                tempResult = pathSum(4, pathNum - 1, tempResult);
                tempResult = pathSum(8, pathNum - 1, tempResult);
                break;
            case 4:
                tempResult = pathSum(3, pathNum - 1, tempResult);
                tempResult = pathSum(9, pathNum - 1, tempResult);
                tempResult = pathSum(0, pathNum - 1, tempResult);
                break;
            case 5:
                break;
            case 6:
                tempResult = pathSum(1, pathNum - 1, tempResult);
                tempResult = pathSum(7, pathNum - 1, tempResult);
                tempResult = pathSum(0, pathNum - 1, tempResult);
                break;
            case 7:
                tempResult = pathSum(2, pathNum - 1, tempResult);
                tempResult = pathSum(6, pathNum - 1, tempResult);
                break;
            case 8:
                tempResult = pathSum(1, pathNum - 1, tempResult);
                tempResult = pathSum(3, pathNum - 1, tempResult);
                break;
            case 9:
                tempResult = pathSum(2, pathNum - 1, tempResult);
                tempResult = pathSum(4, pathNum - 1, tempResult);
                break;
        }
        return tempResult;
    }

以上是我的错误的代码,这里要注意一下,因为5这里比特殊,在走0步的时候,那基本就是初始值,也就是第一次在哪里,那么就是多少个,但是如果0步以上的时候那么,如果从5开始,那么就是能够拨出的号码种类就是0了,因为从5开始后面是没有数字可以选择的,那么就不算是一个种类了。修正了思路以后,用自下向上的动态回归。

public int myRightAnswer(int N) {
        int mod = 1000000007;
        N--;
        long num_0 = 1, num_1 = 1, num_2 = 1, num_3 = 1, num_4 = 1, num_5 = 1, num_6 = 1, num_7 = 1, num_8 = 1, num_9 = 1;
        for (int i = 0; i < N; i++) {
            long num_0_vice = (num_4 + num_6)  % mod;
            long num_1_vice = (num_6 + num_8)  % mod;
            long num_2_vice = (num_7 + num_9)  % mod;
            long num_3_vice = (num_4 + num_8)  % mod;
            long num_4_vice = (num_3 + num_9 + num_0)  % mod;
            long num_6_vice = (num_1 + num_7 + num_0)  % mod;
            long num_7_vice = (num_2 + num_6)  % mod;
            long num_8_vice = (num_1 + num_3)  % mod;
            long num_9_vice = (num_4 + num_2)  % mod;
            num_0 = num_0_vice;
            num_1 = num_1_vice;
            num_2 = num_2_vice;
            num_3 = num_3_vice;
            num_4 = num_4_vice;
            num_6 = num_6_vice;
            num_7 = num_7_vice;
            num_8 = num_8_vice;
            num_9 = num_9_vice;
        }

        int result = 0;
        if (N > 0) {
            result =  (int) (result + num_0) % mod;
            result =  (int) (result + num_1) % mod;
            result =  (int) (result + num_2) % mod;
            result =  (int) (result + num_3) % mod;
            result =  (int) (result + num_4) % mod;
            result =  (int) (result + num_6) % mod;
            result =  (int) (result + num_7) % mod;
            result =  (int) (result + num_8) % mod;
            result =  (int) (result + num_9) % mod;

        } else {
            result =  (int) (num_0 + num_1 + num_2 + num_3 + num_4 + num_5 + num_6 + num_7 + num_8 + num_9) % mod;
        }

        return result;
    }

这个答案提交后,通过。

c2b9fbd44f9ddefe12aabf7b95a287dbc8d.jpg

Review:阅读并点评至少一篇英文技术文章

Programming Is Taught in Exactly the Wrong Way

这篇文章的里面提到,一般的教学编程的,都是定死的教学过程和模板,从变量开始一直教你怎么编程,但是只是教了个编程语言怎么写,但是编程中重要的往往不是这个,打个比方说,学语文,你只教字怎么写是肯定不够的,你要教别人如何正确的表达,或者说,正确的表达,知道怎么使用这些文字才是最重要的。

Tip/Techni:学习至少一个技术技巧

自下向上的动态回归。

 

Share:分享一篇有观点和思考的技术文章

50+ Data Structure and Algorithms Interview Questions for Programmers

工作中可能你不会遇到各种各样的问题,但是面试中往往就是扩大知识面的机会了,这篇文章也是个增进知识的好去处。

转载于:https://my.oschina.net/jamesfuxk/blog/2645911

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值