0821 网易开发岗笔试~通用技术A卷
1. 数组中找两数和小于等于M的数对数量 100
2. 字符串的第k个字符 100
3. 小朋友分纸张 70
4. 二维数组求最短路径 66.67
第三题部分代码,过了70%,请问有路过的大佬解释一下吗?
int tmp = list.get(0); // 第一个小朋友年龄
int num = 1; // 记录纸的总数
int per = 1; // 当前小朋友该发的纸数
for (int i = 1; i < list.size(); i++) { // 遍历其他小朋友
int age = list.get(i);
if (age > tmp) { // 后面小朋友年纪大,多发一张:per+1
per++;
} else if (age < tmp) { // 小 --->有一句话:【旁边】小朋友年龄大的话纸张数要多
per--;
} else // 同岁
per = 1; // // 同岁的小朋友可以少于等于
tmp = list.get(i);
num += per;
} 第四题用的是矩阵动态规划的思想,想不明白为什么没有AC public static int minSailCost(int[][] input) {
int m = input.length, n = input[0].length;
int[][] res = new int[m][n];
res[0][0] = 0;
// 初始化第一列
for (int i = 1; i < m; i++) {
if (input[i][0] == 0)
res[i][0] += (res[i - 1][0] + 2);
if (input[i][0] == 1)
res[i][0] += (res[i - 1][0] + 1);
if (input[i][0] == 2)
res[i][0] = Integer.MAX_VALUE;
}
// 初始化第一行
for (int j = 1; j < n; j++) {
if (input[0][j] == 0)
res[0][j] += (res[0][j - 1] + 2);
if (input[0][j] == 1)
res[0][j] += (res[0][j - 1] + 1);
if (input[0][j] == 2)
res[0][j] = 999999;
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (res[i - 1][j] == 9999999 && res[i][j - 1] == 9999999) {
return -1;
}
if (input[i][j] == 0)
res[i][j] = Math.min(res[i - 1][j], res[i][j - 1]) + 2;
if (input[i][j] == 1)
res[i][j] = Math.min(res[i - 1][j], res[i][j - 1]) + 1;
if (input[i][j] == 2)
res[i][j] = 9999999;
}
}
print(res);
return res[m - 1][n - 1];
} 