经过昨天网易的笔试,光刷算法不太够用,还要涉及程序题,今天阿里笔试加油。笔试都是ACM模式,我现在练习也只用ACM模式。
算法题(牛客网)
1. 矩阵的最小路径和
一开始我用深度遍历搜索,将所有可能的路径和都遍历一遍,发现不行,看了题解才发现要使用动态规划。
代码详情(ACM模式):
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int minPathSum(vector<vector<int>>& matrix) {
int n = matrix.size(), m = matrix[0].size();
for (int i = 1; i < n; ++i) { //初始化最左边一列
matrix[i][0] += matrix[i - 1][0];
}
for (int i = 1; i < m; ++i) { //初始化最上面一行
matrix[0][i] += matrix[0][i - 1];
}
for (int i = 1; i < n; ++i) { //动态规划
for (int j = 1; j < m; ++j) {
matrix[i][j] = min(matrix[i - 1][j], matrix[i][j - 1]) + matrix[i][j];
}
}
return matrix[n - 1][m - 1];
}
};
/*
输入格式:
4 4
1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0
*/
int main() {
int T = 1; //数据组数,有些题目会一口气给一堆数据
for (int t = 0; t < T; ++t) {
int n = 0, m = 0; //n*m矩阵
cin >> n >> m;
vector<vector<int>> matrix(n, vector<int>(m, 0)); //存储矩阵数据
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> matrix[i][j]; //写入矩阵数据
}
}
Solution sl;
cout << sl.minPathSum(matrix);
}
return 0;
}
2. 表达式求值
看了题解,自己重新一点一点终于写出来了,先理解没有括号的算法,有括号的时候,将括号内的数提取出来,不就是没有括号的算法了嘛。
代码详情:
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
class Solution {
public:
int solve(string s) {
int n = s.size();
stack<int> sum; //和栈-存储每个数
int sign = s[0] == '-' ? '-' : '+'; //记录符号
int num = 0; //记录数
for (int i = 0; i < n; ++i) {
if (s[i] >= '0' && s[i] <= '9') {
num = num * 10 + (s[i] - '0');
}
if (s[i] == '(') {
int count = 1; //记录括号数
int left = i; //记录左括号
while (count > 0) { //获取括号内的数
i++;
if (s[i] == ')') count--;
else if (s[i] == '(') count++;
}
num = solve(s.substr(left+1, i - left - 1)); //计算括号内的数
}
if (!(s[i] >= '0' && s[i] <= '9') || i == n-1) { //遇到符号或最后一个数,将数加入和栈
if (sign == '-') sum.push(-num);
else if (sign == '+') sum.push(num);
else if (sign == '*') sum.top() *= num;
sign = s[i]; //更新符号
num = 0; //初始化数
}
}
int res = 0; //记录最终答案
while (!sum.empty()) { //求和
res += sum.top();
sum.pop();
}
return res;
}
};
/*
输入格式:
6
1+2
1+5*2
2+3+6
5*2*2
1*(2+1)
(3+4)*(5+(2-3))
*/
int main() {
int T = 1; //T组数据
cin >> T;
for (int t = 0; t < T; ++t) {
string s; //输入字符串
cin >> s;
Solution sl;
cout << sl.solve(s) << endl;
}
return 0;
}
算法真题
1. 牛牛铺地毯
发现规律就不难,跟普通的动态规划一样,不过是前三项相加。题目说结果模10007,还以为是最后一个才模,原来每一个都要模。
代码详情:
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int solve(int n) {
vector<int> dp(3, 0); //创建动态规划数组
dp[0] = 1, dp[1] = 2, dp[2] = 4;
if (n < 4) return dp[n - 1];
for (int i = 3; i < n; ++i) {
dp.push_back((dp[i - 1] + dp[i - 2] + dp[i - 3]) % 10007);
}
return dp[n - 1];
}
};
/*
输入数据:
4
1
2
3
5
*/
int main() {
int T = 0; //T组数据
cin >> T;
for (int t = 0; t < T; ++t) {
int n = 0;
cin >> n;
Solution sl;
cout << sl.solve(n) << endl;
}
return 0;
}
面试题
1. MVC框架
什么是MVC?MVC分别是:Model(模型)、View(视图)和Controller(控制)。用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在需要改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间。
今天阿里笔试感觉很不错,500分能拿300分左右,有一道一题跟今天刷的第一题超级像,但它多了个向上移动,可惜没做出来。开心~,放个假,休息一波。