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:13
点赞 回复 分享
发布于 2017-03-07 21:42
超级素数幂(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
数学膜果orz
点赞 回复 分享
发布于 2017-03-08 08:06
求java版
点赞 回复 分享
发布于 2017-03-07 21:22
有Java版的没
点赞 回复 分享
发布于 2017-03-07 21:19
return input
点赞 回复 分享
发布于 2017-03-25 21:05
循环单词也有毒……特意对以下这种情况做了处理…… 4 goran igor domagoj relja 对应输出应该为: 4 你的输出为: 0
点赞 回复 分享
发布于 2017-03-22 21:53
好多鱼有毒,首先以为吃鱼关系必须是2-10的整数倍,然后以为是问同时可以放入多少种不同大小的鱼到鱼缸……就说怎么一直不通过ORZ……
点赞 回复 分享
发布于 2017-03-22 20:16
膜拜果姐~
点赞 回复 分享
发布于 2017-03-13 14:49
我用的你的代码,然后用这样的输入,显然这样2 3 4 5这4个鱼都能放进去了,但是4 5明显要吃掉2的啊0.0
点赞 回复 分享
发布于 2017-03-12 15:36
好多鱼那个,不用考虑后放入的鱼会不会吃掉先放入的鱼么
点赞 回复 分享
发布于 2017-03-12 15:30
up
点赞 回复 分享
发布于 2017-03-11 23:50
选择题在哪里还能看到么?
点赞 回复 分享
发布于 2017-03-11 14:46
问一下,下一场的报名链接在哪了?
点赞 回复 分享
发布于 2017-03-10 16:27
关于循环单词的一点理解: 循环单词一定要有循环单词对,才能说明是循环单词。 而本参考代码下, 如果n个单词互不“相同”,则有n个循环单词 例如, 5 i love you dose he 结果输出为5. 结果显然不对吧
点赞 回复 分享
发布于 2017-03-10 11:28
求简历,杭州微策略公司3月份春招2017届应届毕业生,招 开发 和 测试 两个岗位,工作地点:西湖国际科技大厦三楼,有兴趣的同学可以把简历发至che@microstrategy.com,即可内推,最后求简历怒砸!
点赞 回复 分享
发布于 2017-03-10 09:50
求简历,杭州微策略公司春招2017届应届毕业生,招 开发 和 测试 两个岗位,工作地点:西湖国际科技大厦三楼,有兴趣的同学可以把简历发至che@microstrategy.com,最后求简历怒砸!
点赞 回复 分享
发布于 2017-03-10 09:45
我感觉牛客出的这个题本身就有问题,真的是让人醉了。。。。 例如:好多鱼 ,题目中说的很清楚 ,其中的鱼不能小于2倍不能大于10倍,可是测试的时候我竟然看到了测试例子中有给定的鱼的大小是2 2 2 2 8 8 8 64 64 ??? 可能是我没弄懂题意??????????????????
点赞 回复 分享
发布于 2017-03-09 18:20
同问,为什么翻转那题最小步数<=A+B,一直搞不懂
点赞 回复 分享
发布于 2017-03-09 09:33
厉害
点赞 回复 分享
发布于 2017-03-08 23:04

相关推荐

不愿透露姓名的神秘牛友
昨天 16:15
你知道对于一个平常不接电话,从来不发语音,只打字交流的人来说电话面有多恐怖吗....刚刚亲眼目睹了舍友电话面...她甚至还在吃饭...就这么水灵灵的打过来开始问了...感觉如果是面对面我真的会紧张到跪下来给面试官磕一个...
一只ikun:额,其实没那么恐怖,最难迈开的是第一步,相信我,你面完第一次后面就不怕了。第一次面试我还想着找个自习室面试,到后面我打着游戏突然来电话我就直接面试了
点赞 评论 收藏
分享
牛客84809583...:举报了
点赞 评论 收藏
分享
07-02 18:09
门头沟学院 Java
苍穹外卖和谷粒商城这俩是不是烂大街了,还能做吗?
想去重庆的鸽子在吐槽:你不如把这俩做完自己搞明白再优化点再来问 何必贩卖焦虑
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务