网易2017实习生招聘笔试题编程题参考思路和代码
原题地址:https://www.nowcoder.com/test/4575457/summary
奇怪的表达式求值
分析
直接模拟过去就完了。
参考code
#include <bits/stdc++.h>
using namespace std;
string s;
int main(){
cin >> s;
int ans = s[0] - '0';
for(int i = 1; i < (int)(s.size() - 1); i+=2){
if(s[i] == '*')
ans = ans * (s[i + 1] - '0');
else if(s[i] == '+')
ans = ans + (s[i + 1] - '0');
else {
ans = ans - (s[i + 1] - '0');
}
}
cout << ans << endl;
}
分饼干
分析
枚举每个位置的数字,然后记录满足要求的答案数就可。
参考code
#include <bits/stdc++.h>
using namespace std;
long long n1[10001], n2[10001];
int main(){
string s;
int n;
cin >> s >> n;
long long ret = 0;
n1[0] = 1;
for(int i = 0; i < s.size(); i++){
memset(n2, 0, sizeof(n2));
for(int j = 0; j < n; j++){
for(int k = 0; k < 10; k++){
if(isdigit(s[i]) && s[i] - '0' != k) continue;
n2[ ( ( j * 10) + k ) % n] += n1[j];
}
}
memcpy(n1,n2,sizeof(n1));
}
cout << n1[0] << endl;
}
消除重复元素
分析
根据题意模拟一下就行
参考code
#include <bits/stdc++.h>
using namespace std;
int n;
int a[105];
map<int,int> m;
vector<int> ret;
int main(){
cin >> n;
for(int i = 0; i < n; i++) cin >> a[i];
for(int i = 0; i < n; i++) m[a[i]]++;
for(int i = 0; i < n; i++){
m[a[i]]--;
if(!m[a[i]])
ret.push_back(a[i]);
}
int len = ret.size();
for(int i = 0; i < len; i++){
if(i == len - 1) printf("%d\n",ret[i]);
else printf("%d ",ret[i]);
}
return 0;
}
赶去公司
分析
枚举去每个出租车点打车需要的总时间,最后和完全步行总时间取个最小值即可。
参考code
#include <bits/stdc++.h>
using namespace std;
int n,tx[55],ty[55],gx,gy,walkTime,taxiTime;
int main(){
cin >> n;
for(int i = 0; i < n; i++) cin >> tx[i];
for(int i = 0; i < n; i++) cin >> ty[i];
cin >> gx >> gy;
cin >> walkTime >> taxiTime;
int ans = (abs(gx - 0) + abs(gy - 0)) * walkTime;
for(int i = 0; i < n; i++){
int res = (abs(tx[i] - 0) + abs(ty[i] - 0)) * walkTime;
res += (abs(tx[i] - gx) + abs(ty[i] - gy)) * taxiTime;
ans = min(ans, res);
}
cout << ans << endl;
return 0;
}
小易记单词
分析
用set模拟一下即可
参考code
#include <bits/stdc++.h>
using namespace std;
int m, n;
set<string> S1;
set<string> S2;
int main() {
cin >> n >> m;
for(int i = 0; i < n; i++) {
string x;
cin >> x;
S1.insert(x);
}
for(int i = 0; i < n; i++) {
string x;
cin >> x;
S2.insert(x);
}
int ans = 0;
for(auto &x : S1) {
if(S2.find(x) != S2.end()) ans += x.size() * x.size();
}
cout << ans << endl;
return 0;
}
涂棋盘
分析
暴力枚举维护答案即可。
参考code
#include <bits/stdc++.h>
using namespace std;
vector <string> mp;
int n;
int solve(vector <string> grid) {
int w = 0, b = 0, W = 0, B = 0, MAX = 0;
for(int i = 0; i < n; i++) {
w = 0; b = 0; W = 0; B = 0;
for(int j = 0; j < n; j++) {
if(grid[j][i]=='B') {
b++; w = 0;
if(b > B) B = b;
}
if(grid[j][i]=='W') {
w++; b = 0;
if(w > W) W = w;
}
}
if(B > MAX) MAX = B;
if(W > MAX) MAX = W;
}
return MAX;
}
int main() {
cin >> n;
for(int i = 0; i < n; i++) {
string s;
cin >> s;
mp.push_back(s);
}
cout << solve(mp) << endl;
return 0;
}
集合
分析
枚举所有值组成的pair,约分之后丢进set去重即可。
参考code
#include <bits/stdc++.h>
using namespace std;
int w, x, y, z;
set<pair<int, int> > S;
int main(){
cin >> w >> x >> y >> z;
for(int i = w; i <= x; i++) {
for(int j = y; j <= z; j++) {
int ii = i, jj = j;
int di = __gcd(i, j);
ii /= di; jj /= di;
S.insert(make_pair(ii, jj));
}
}
cout << S.size() << endl;
return 0;
}
工作安排
分析
暴力枚举每个位置工作的安排情况记录答案即可。
参考code
#include <bits/stdc++.h>
using namespace std;
vector<string> a;
int n;
int b[10];
int ret;
void dfs(int i) {
if(i == a.size()) {
ret++;
} else {
for(int j = 0; j < a[i].size(); j++) {
if(b[a[i][j] - '0']) {
b[a[i][j] - '0'] = 0;
dfs(i + 1);
b[a[i][j] - '0'] = 1;
}
}
}
}
int main() {
cin >> n;
for(int i = 0; i < n; i++) {
string x; cin >> x;
a.push_back(x);
}
for(int i = 0; i < 10; i++) b[i] = 1;
ret = 0;
dfs(0);
cout << ret << endl;
return 0;
}
调整队形
分析
由于我们只有目标状态只可能是两种,形如: BBBBBGGGGG GGGGGBBBBB 于是我们对于串中第一个'B'然后计算把它swap到第一个位置需要多少次,第二个'B'swap到第二个位置需要多少次...依次类推.. 然后对于'G'同理,最后取个较小值即为答案。
参考code
#include <bits/stdc++.h>
using namespace std;
string s;
int main(){
cin >> s;
int rb = 0, rg = 0;
int b = 0, g = 0;
for(int i = 0; i < s.size(); i++) {
if(s[i] == 'B') {
rb += i - b; ++b;
} else {
rg += i - g; ++g;
}
}
cout << min(rb, rg) << endl;
return 0;
}
双核处理
分析
首先我们观察到数据量都是1024的倍数,所以我们可以对于所有都除以一个1024,然后最后再算回来。 这显然是一个经典的动态规划的问题,直接搞就好了。 过不了的大概因为是用的贪心做法,可以尝试自己构造一波反例。。
参考code
#include <bits/stdc++.h>
using namespace std;
int vis[204800];
vector<int> a;
int n;
int solve(vector<int> vec) {
int i, j, len = 0;
for(int i = 0; i < vec.size(); ++i) len += (vec[i] /= 1024);
memset(vis, 0, sizeof(vis[0]) * (len / 2 + 1));
vis[0] = 1;
for(i = 0; i < vec.size(); ++i) {
for(j = len / 2 - vec[i]; j >= 0; --j) {
if(vis[j] && !vis[j + vec[i]]) {
vis[j + vec[i]] = 1;
}
}
}
i = len / 2;
while(i >= 0 && !vis[i])
--i;
return (len - i) * 1024;
}
int main(){
cin >> n;
for(int i = 0; i < n; i++) {
int x; cin >> x;
a.push_back(x);
}
cout << solve(a) << endl;
return 0;
}
魔力手环
分析
把手环数字转为一个向量,然后乘
[1 1 0 0 0]
[0 1 1 0 0]
[0 0 1 1 0]
[0 0 0 1 1]
[1 0 0 0 1]
这个矩阵N次即可。。用个矩阵快速幂,边算边求模。
参考code
#include <bits/stdc++.h>
using namespace std;
void mult(int A[50][50], int B[50][50], int C[50][50], int n) {
int T[50][50];
memset(T, 0, sizeof(T));
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
for(int k = 0; k < n; k++) {
T[i][j] = (T[i][j] + A[i][k] * B[k][j]) % 100;
}
}
}
memcpy(C, T, sizeof(T));
}
void mypower(int A[50][50], int R[50][50], int n, int m) {
if(n == 0) {
memset(R, 0, sizeof(int) * 2500);
for(int i = 0; i < m; i++) R[i][i] = 1;
} else if(n % 2 == 0) {
mypower(A, R, n/2, m);
mult(R, R, R, m);
} else {
mypower(A, R, n - 1, m);
mult(A, R, R, m);
}
}
vector<int> solve(vector<int> seq, int m) {
int A[50][50], R[50][50], n = (int)seq.size();
memset(A, 0, sizeof(A));
for(int i = 0; i < n; i++) A[i][i] = A[i][(i + 1) % n] = 1;
mypower(A, R, m, n);
vector<int> res;
for(int i = 0; i < n; i++) {
int sum = 0;
for(int j = 0; j < n; j++) sum = (sum + R[i][j] * seq[j]) % 100;
res.push_back(sum);
}
return res;
}
int main () {
int n, k;
vector<int> x;
cin >> n >> k;
for(int i = 0; i < n; i++) {
int tmp; cin >> tmp;
x.push_back(tmp);
}
vector<int> ans = solve(x, k);
for(int i = 0; i < ans.size(); i++) i == 0 ? cout << ans[i] : cout << " " << ans[i];
return 0;
}
堆砖块
分析
从没有砖块开始分析。考虑每块砖块放入的决策,放入左边,放入右边和不使用这块砖块三种情况。 然后做个dp,这里用滚动数组优化了下空间。
参考code
#include <bits/stdc++.h>
using namespace std;
const int maxn = 500010;
int n;
vector<int> a;
int dp[2][maxn];
int solve(vector<int> v) {
int res = 0;
memset(dp, 0, sizeof(dp));
int p = 0;
for(int i = 0; i < v.size(); i++) {
dp[p][v[i]] = max(dp[1-p][v[i]] , v[i]);
for(int ix = 0; ix < maxn; ix++) {
if(dp[1 - p][ix]) {
if(dp[p][ix] < dp[1 - p][ix]) dp[p][ix] = dp[1-p][ix];
dp[p][ix + v[i]] = max(dp[p][ix + v[i]], max(dp[1 - p][ix + v[i]], dp[1 - p][ix] + v[i]));
dp[p][abs(ix - v[i])] = max(dp[p][abs(ix - v[i])], max(dp[1 - p][abs(ix - v[i])], max(dp[1-p][ix] - ix + v[i], dp[1 - p][ix])));
}
}
p = 1 - p;
}
if(dp[1 - p][0]) res = dp[1 - p][0];
else res = -1;
return res;
}
int main() {
cin >> n;
for(int i = 0; i < n; i++) {
int x; cin >> x;
a.push_back(x);
}
cout << solve(a) << endl;
return 0;
}#C++工程师##iOS工程师#
