what?什么是ARTS
- Algorithm:每周至少做一个leetcode的算法题;
- Review:阅读并点评至少一篇英文技术文章;
- Tip/Techni:学习至少一个技术技巧;
- Share:分享一篇有观点和思考的技术文章;
Algorithm:每周至少做一个leetcode的算法题
规则就是如果你只能在 如果你在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;
}
这个答案提交后,通过。
Review:阅读并点评至少一篇英文技术文章
Programming Is Taught in Exactly the Wrong Way
这篇文章的里面提到,一般的教学编程的,都是定死的教学过程和模板,从变量开始一直教你怎么编程,但是只是教了个编程语言怎么写,但是编程中重要的往往不是这个,打个比方说,学语文,你只教字怎么写是肯定不够的,你要教别人如何正确的表达,或者说,正确的表达,知道怎么使用这些文字才是最重要的。
Tip/Techni:学习至少一个技术技巧
自下向上的动态回归。
Share:分享一篇有观点和思考的技术文章
50+ Data Structure and Algorithms Interview Questions for Programmers
工作中可能你不会遇到各种各样的问题,但是面试中往往就是扩大知识面的机会了,这篇文章也是个增进知识的好去处。