360 笔试题目复盘 - 研发 E 卷,前端开发的笔试题,包括选择题 30 道与两道编程
# 选择题(30 道)
啥都考,巴拉巴拉巴拉的,数据库啊高数啊方程啊,后半段前端题居多。
# 编程题 - 1 强密码验证(简易)
要求大致为
- 密码长度为 8 以上
- 必须包含数字、大写字母、小写字母和特殊符号(缺一不可)
输入样例
12_Aaqq12
Password123
PASSWORD_123
PaSS^word
12_Aaqq
输出样例
Ok
Irregular password
Irregular password
Irregular password
Irregular password
# 思路
js 的话写个正则就好了,但是我正则玩不溜 qwq
只能遍历一遍判断了,也没啥问题一遍过,非常的简单粗暴啊(小孩子不要学)
# 代码
#include <iostream> | |
#include <cstring> | |
#include <string> | |
using namespace std; | |
string str; | |
bool judge(string s) { | |
int len = s.length(); | |
if(len < 8) return false; | |
bool flag[4]; // 有数字 | |
memset(flag, false, sizeof(flag)); | |
int cnt = 0; | |
for(int i = 0; i < len; ++i) { | |
if(s[i] >= 'A' && s[i] <= 'Z') { | |
if(!flag[0]) { | |
flag[0] = true; | |
++cnt; | |
} | |
} else if(s[i] >= 'a' && s[i] <= 'z') { | |
if(!flag[1]) { | |
flag[1] = true; | |
++cnt; | |
} | |
} else if(s[i] >= '0' && s[i] <= '9') { | |
if(!flag[2]) { | |
flag[2] = true; | |
++cnt; | |
} | |
} else if(!flag[3]) { // 特殊字符 | |
flag[3] = true; | |
++cnt; | |
} | |
if(cnt == 4) return true; | |
} | |
return false; | |
} | |
int main() { | |
while(cin >> str) { | |
if(judge(str)) cout << "Ok" << endl; | |
else cout << "Irregular password" << endl; | |
} | |
return 0; | |
} |
# 编程题 - 2 堆积货物(Web)
大意就是,原有 RCL 的货物堆成一个长方体,被小偷偷成了 (R-2)(C-1)(L-2) 的长方体。
通过现在的货物总数。算出最坏情况下被偷了多少的货物,输出这个最坏的值。
输入描述
输入为一个数 n, 表示题面中的 (R-2)(C-1)(L-2)
输出描述
输出为一个数,表示最坏情况下被偷了多少的货物
样例输入
4
样例输出
41
提示
对于 100% 的数据:1 ≤ n ≤ 10^9
样例解释: R=3,C=5,L=3, 3*5 * 3-(3-2)*(5-1)*(3-2)=41
# 分析
3 2 3 = 18
1 1 1 = 1
偷走了 17
4 2 5 = 40
2 1 3 = 6
偷走了 34
偷走三个长方体 偷走体积为 1*(R+2)*(L+2)+ 2*R*C +2*(R+2)*C
(估计是可以用数学推出来的,不过我暴力然后剪枝之后也 ac100% 了)
俺的暴力解法:设 r、l、c 分别为偷走后的长宽高,R = r+2, L = l+2, C = c+1,易知 rcl 肯定都为 n 的因数,将 n 分解质因数后把所有质因数存在 m 中,遍历 m 取得每个 r、l、c,中途再剪剪枝,当前两个数乘起来已经大于 n 了的时候就跳过。
# 代码
#include <iostream> | |
#include <algorithm> | |
#include <cmath> | |
#include <vector> | |
using namespace std; | |
typedef long long ll; | |
int n; | |
ll ans; | |
vector<ll> m; | |
int main() { | |
cin >> n; | |
int k = sqrt(n); | |
for(int i = 1; i <= k; ++i) { | |
if(n % i == 0) { | |
m.push_back(i); | |
m.push_back(n/i); | |
} | |
} | |
sort(m.begin(), m.end()); | |
int len = m.size(); | |
for(int r = 0; r < len; ++r) { | |
for(int l = 0; l < len; ++l) { | |
ll t = m[r]*m[l]; | |
if(t > n) continue; // 剪枝 | |
for(int c = 0; c < len; ++c) { | |
ll nown = t*m[c]; | |
if(nown != n) continue; | |
ll R = m[r]+2; | |
ll L = m[l]+1; | |
ll C = m[c]+2; | |
ll stole = ll(R*L*C) - nown; | |
ans = max(ans, stole); | |
} | |
} | |
} | |
cout << ans << endl; | |
return 0; | |
} |