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) 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

相关推荐

bg:双非本,一段中小厂6个月测开实习今天发这个帖子主要是想聊一聊我秋招以来的一个发展我是在8月底辞职,打算秋招,可是看网上都说金九银十就想着自己就是一个普通本科生,现在九月份都是一些大神在争抢,所以9月份基本上没投,等到了10月份才开始秋招,可是这个时间好像已经有些晚了,今年秋招开启的格外早,提前到了7,8月份,我十月才开始,官网投了很多公司,没有任何一个面试机会,这个情况一直到了十月底才有了第一个面试,当时没有面试经验,所以不出意外的挂了后续就是漫长的投递,但是毫无例外没有面试,没有办法我只能另辟蹊径开始在BOSS上边投递,然后顺便也根据BOSS上边这个公司名称去浏览器搜索看看有没有官网投递渠道,毕竟官网上投递后还是可以第一时间被HR看到的,然后一直不停投递,一开始第一个星期基本上都是投的正式秋招岗位到了第二个星期才开始实习和正式一起投,到十一月底的时候已经沟通了700➕才有一共1个正式的,5个要提前实习的,3个实习的面试,最后结果是过了1个要提前实习的和2个实习的每次面试我都会复盘,发现这些小公司面试官问的五花八门,有的专问基础,有的专问项目,有的啥都问,不过自己也是看出来了一下门道,就是小公司不像大公司面试官那样能力比较强基本上你简历上边的他都会,然后会根据简历来问,小公司面试官他们更多的是看自己会什么,然后看看你简历上边哪些他也是会的然后来问,经过不断的复盘加上背各种各样面试题,到了11月底12月初才有了1个要提前实习的offer还有2个实习的offer,而且薪资待遇对我来说已经很可观了可是啊,人总是这样得了千钱想万钱,我又开始不满现状,但是此时的我面试能力经过这么多面试和复盘已经很强了,然后在十二月份运气爆棚,被极兔和小鹏补录捞起来面试,还有个百度测开的实习面试,这个时候因为有了offer所以感觉有了底气,面试也很自信,最后结果是全部都过了那个时候我感觉自己真的很厉害,我问了极兔那边的HR像我这样的双非本收到offer的在极兔有多少?他告诉我产研岗90%都是硕士,10%里边基本上都是211,985,想我这样的很少很少,那一刻感觉自己超级牛逼,小鹏就更不用说了,最后也是不出意外选择了小鹏所以我就我个人经历想对和我学历履历差不多的牛友一些建议第一:秋招一定要趁早,真到了9,10月,那个时候可能你投的结果可能还不如7,8,11月,第二:最好先拿小公司实习或者正式练练手,提升一下面试能力,我个人觉得因为小公司问的五花八门所以你会更加横向去提升自己能力,而且大公司其实面试没有那么难,除了一些非常卷的岗位,公司大神比较多会问的很难,一般好点的公司都不会问的那么难,他们也知道都是应届生不会要求那么高第三:当有一定能力后,就是坚持了,对于我们这样的学历,没有特别强的履历情况下,就是要抓住提前批和补录的机会,这个时候各方面不会卡的很严,是我们很好很好的一个机会第四:就是运气也是很重要的一部分,不过这个很难去说什么最后祝各位牛友都能收获自己满意的offer😁😁😁
秋招,不懂就问
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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