2017年校招全国统一模拟笔试(第一场)编程题参考代码汇总

预告:下一场考试10日开启报名,23日考试,请大家注意及时报名参加模拟考试。

报名地址&第一次参加考试的成绩报告下载地址: https://www.nowcoder.com/activity/MockExam2017   

本次模拟考试题目练习链接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;
}
全部评论
点赞 回复 分享
发布于 2017-03-07 21:42
有Java版的没
点赞 回复 分享
发布于 2017-03-07 21:19
求java版
点赞 回复 分享
发布于 2017-03-07 21:22
数学膜果orz
点赞 回复 分享
发布于 2017-03-08 08:06
超级素数幂(java) import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); long n=in.nextLong(); func(n); } public static void func(long n){ long p=(long)(Math.sqrt(n)+1); long q=2; for(;p>=2;p--){ long tmp=myPow(p,q); long flag=tmp-n; if(flag==0){ if(!isPrime((int)p)) continue; System.out.println(p+" "+q); return ; }else if(flag<0){ q++; p=(long)(Math.pow(n,1.0/q)+1); } //if(!isPrime(p)) continue; //isprime //long tmp=n; /*if((q=isOK(p,tmp))>0){ System.out.println(p+" "+q); return ; }*/ } System.out.println("No"); } public static boolean isPrime(int n){ if(n<=1) return false; for(int i=2;i*i<=n;i++){ if(n%i==0) return false; } return true; } public static long myPow(long p,long q){ return q == 0 ? 1 : myPow(p, q-1) * p; } /*public static long isOK(long p, long n){ if(n==1) return 0; if(n%p==0){ return isOK(p,n/p)+1; } return -1; }*/ }
点赞 回复 分享
发布于 2017-03-08 10:06
厉害
点赞 回复 分享
发布于 2017-03-07 21:11
高效率!
点赞 回复 分享
发布于 2017-03-07 21:11
给跪了
点赞 回复 分享
发布于 2017-03-07 21:12
好厉害啊
点赞 回复 分享
发布于 2017-03-07 21:13
另外在一个初始0的位置我们最多的双翻次数是floor((X - 1) / 2),在其他位置最大的双翻次数为floor(X / 2).所以最大的双翻次数等于 A floor((X - 1) / 2) + B floor(X / 2), 所以第二个条件是rest <= A floor((X - 1) / 2) + B * floor(X / 2)。 这一段啥意思,能给个例子不
点赞 回复 分享
发布于 2017-03-07 21:15
怎么做到的(⊙o⊙).....
点赞 回复 分享
发布于 2017-03-07 21:18
沃日,这也太效率了吧
点赞 回复 分享
发布于 2017-03-07 21:21
给跪
点赞 回复 分享
发布于 2017-03-07 21:22
10亿大小的数能用cin输入进去吗?不是得大数据处理么?
点赞 回复 分享
发布于 2017-03-07 21:22
果姐威武Orz
点赞 回复 分享
发布于 2017-03-07 21:22
效率真高
点赞 回复 分享
发布于 2017-03-07 21:23
Android 的好多鱼 不是五个参数吗  这C++的才三个?  不开心
点赞 回复 分享
发布于 2017-03-07 21:25
可怕!
点赞 回复 分享
发布于 2017-03-07 21:27
佩服
点赞 回复 分享
发布于 2017-03-07 21:33
大写的服啊
点赞 回复 分享
发布于 2017-03-07 21:41

相关推荐

点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务