2017年校招全国统一模拟笔试(第一场)编程题参考代码汇总
预告:下一场考试10日开启报名,23日考试,请大家注意及时报名参加模拟考试。
本次模拟考试题目练习链接https://www.nowcoder.com/test/4236887/summary
面试算法课程https://www.nowcoder.com/courses/semester/algorithm
好多鱼
分析
直接暴力枚举然后check就好了
参考code
#include <bits/stdc++.h>
using namespace std;
int a[55];
int mi,ma;
int n;
int main(){
cin >> mi >> ma;
cin >> n;
for(int i = 0; i < n; i++) cin >> a[i];
int ans = 0;
for(int i = mi; i <= ma; i++){
int flag = 1;
for(int j = 0; j < n; j++){
if( (i >= a[j] * 2 && i <= a[j] * 10) || (i * 2 <= a[j] && i * 10 >= a[j]) ){
flag = 0;
}
}
if(flag) ans++;
}
cout << ans << endl;
}
循环单词
分析
范围比较小,直接暴力求每个串的最小表示。然后丢进set去重就好了
参考code
#include <bits/stdc++.h>
using namespace std;
int n;
string calc(string s){
vector<string> v;
for(int i = 0; i < (int)s.length(); i++){
string tmp = s;
for(int j = 0; j < (int)s.length(); j++) tmp[j] = s[(j + i) % s.length()];
v.push_back(tmp);
}
sort(v.begin(),v.end());
return v[0];
}
int main(){
set<string> s;
cin >> n;
for(int i = 0; i < n; i++){
string x;
cin >> x;
s.insert(calc(x));
}
cout << s.size() << endl;
}
连续整数
分析
排序之后分别讨论几种可能的情况就OK了
参考code
#include <bit/stdc++.h>
using namespace std;
int n;
int num[55];
int main(){
cin >> n;
for(int i = 0 ; i < n; i++) cin >> num[i];
sort(num,num + n);
for(int i = 0; i < n - 1; i++){
if(num[i] == num[i + 1] || num[i + 1] > num[i] + 2){
cout << "mistake"<< endl;
return 0;
}
}
int cnt = 0;
for(int i = 0; i < n - 1; i++){
if(num[i + 1] == num[i] + 2) cnt++;
}
if(cnt > 1){
cout << "mistake"<< endl;
return 0;
}
for(int i = 0; i < n - 1; i++){
if(num[i + 1] == num[i] + 2){
cout << num[i] + 1 << endl;
return 0;
}
}
if(num[0] == 1){
cout << num[n-1] + 1 << endl;
}else{
cout << num[0] - 1 << " " << num[n-1] + 1 << endl;
}
return 0;
}
DNA合成
分析
暴力一遍,统计结果即可。
参考code
#include <bits/stdc++.h>
using namespace std;
int main(){
string s1,s2;
cin >> s1 >> s2;
int ans = 0;
for(int i = 0; i < s1.size(); i++){
if(s1[i] == 'A' && s2[i] == 'T') ans++;
if(s1[i] == 'T' && s2[i] == 'A') ans++;
if(s1[i] == 'C' && s2[i] == 'G') ans++;
if(s1[i] == 'G' && s2[i] == 'C') ans++;
}
cout << s1.size() - ans << endl;
return 0;
}
超级素数幂
分析
暴力枚举幂q,然后n开q次幂之后check一下是否相等和p是否是素数。注意一下精度问题就好了
参考code
#include <bits/stdc++.h>
using namespace std;
long long n;
long long calc(long long m, int n){
return n == 0 ? 1 : calc(m, n-1) * m;
}
bool check(long long n){
long long tmp = sqrt(n);
for(long long i = 2; i <= tmp; i++){
if(n % i == 0) return false;
}
return true;
}
int main(){
cin >> n;
int flag = 1;
for(int i = 2;;i++){
double tmp = pow(n,1.0/i);
if(tmp < 2.0) break;
if(calc((long long)(tmp + 0.1),i) == n && check((long long)(tmp + 0.1))){
flag = 0;
cout << (int)(tmp + 0.1) <<" "<< i << endl;
}
}
if(flag) cout << "No" << endl;
}
序列和
分析
我们要找连续的一段长度大于等于L小于等于100整数和等于N,容易观察到合法的长度范围很小,于是我们从L开始枚举,然后找到第一个输出即可。
参考code
#include <bits/stdc++.h>
using namespace std;
vector <int> sequence(int S, int L0) {
vector<int> R;
for(int L = L0; L <= 100; L++) {
if (S - L * (L - 1) / 2 >= 0 && (S - L * (L - 1) / 2) % L == 0) {
int A = (S - L * (L - 1) / 2) / L;
for (int i = 0; i < L; i++) R.push_back(A + i);
return R;
}
}
return R;
}
int main() {
int S,L;
cin >> S >> L;
vector<int> ans;
ans = sequence(S, L);
if(ans.size() == 0) cout << "No" << endl;
else {
for(int i = 0; i < ans.size(); i++) {
i == 0 ? cout << ans[i] : cout << " " << ans[i];
}
}
return 0;
}
页码统计
分析
一个很经典的问题。会的就直接数位dp好了。 不会的看看《编程之美》P132
参考code
#include <bits/stdc++.h>
using namespace std;
vector<int> solve(int n) {
vector<int> res(10, 0);
if(!n) return res;
if(n % 10 < 9) {
res = solve(n - 1);
while(n) {
res[n % 10]++;
n /= 10;
}
return res;
}
res = solve(n / 10);
for(int i = 0; i < 10; i++) res[i] = res[i] * 10 + n / 10 + (i > 0);
return res;
}
int main() {
int n;
cin >> n;
vector<int> ans = solve(n);
for(int i = 0; i < ans.size(); i++) {
i == 0 ? cout << ans[i] : cout << " " << ans[i];
}
return 0;
}
01翻转
分析
这个题应该有多种解法。第一眼看起来很BFS但是复杂度大概是O((A+B)*K),应该需要怎么优化才可以。
参考code
#include <bits/stdc++.h>
using namespace std;
int solve(long long a, long long sum, long long k) {
long long mx = 0, rest, use;
if(a == 0) return 0;
for(int i = 1; i <= 210000; i++) {
mx += k;
if(mx < a) continue;
rest = mx - a;
use = (sum - a) * (i / 2);
use += a * ((i - 1) / 2);
use *= 2;
if(rest % 2 == 0 && rest <= use) return i;
}
return -1;
}
int main() {
int A , B , K;
cin >> A >> B >> K;
int ans = solve(A, A + B, K);
cout << ans << endl;
}
查看12道真题和解析