清泽心雨 移动互联 2016 笔试模拟题 题解

这次模拟题的难度类比考试题,会有难度梯度,也尽量能够区分大家的编程水平,正式考试时间为2个小时,一共5道题,题目不排除有英文的可能,允许查字典,考试地点届时看群公告,题解会随后发出,会有1道题涉及较复杂算法,有1道题较简单的算法但逻辑能力要求较强,有三道题为简单题,考验大家的编程水平,考试会有实时排名,排名的分数和AC题的时间,提交错误的罚时都会有影响,我们最终将根据排名,辅助其它方面一同决定最终留下的人员。

大家重点解题的具体思路,我不会给出每一句代码的思路,要自己阅读,仔细思考,加油!

A:A+B 简单题
Solution:
水题,希望大家熟悉环境,掌握输入输出的技巧,最后要有一个\n

#include<cstdio>
using namespace std;

int main(){
    int a,b;

    while(~scanf("%d%d",&a,&b)){
        printf("%d\n",a+b);
    }

    return 0;
}

B:前n项和 简单题
Solution:
前n项和公式为:n*(n+1)/2,注意到结果可能在32位有符号整数之内,但是运算过程中两数相乘就有可能溢出,我们索性就用long long,别忘了每一个结果后跟一个空行。

#include<cstdio>
using namespace std;

int main(){
    long long n,sum;

    while(~scanf("%lld",&n)){
        sum = n*(n+1)/2;
        printf("%lld\n\n",sum);
    }

    return 0;
}

C:A*B 难题
Solution:
单纯的利用字符串进行模拟高精度乘法效率不够高,会出现TLE,所以我们需要使用NTT(快速数论变换)或者FFT(快速傅里叶变换)来求卷积,把10,100分别理解成阶.
这道题想带给大家的收获:
看起来简单的问题不一定简单,要对数字溢出有概念,要对效率有追求,对相关算法感兴趣的同学可以继续了解,不感兴趣的同学可以直接跳过,考试时如果做出这个难度的题那真的是一个不可多得人才。
此题较难,单独列出我的另一篇博文:
题解:http://blog.csdn.net/cfarmerreally/article/details/52668610

D:日期转换 简单题
Solution:
字符串处理,编程时注意相关的细节,也希望大家找到适合自己的代码风格。

#include <stdio.h>  

char *sampm[] = {"am", "pm"};  

int main()  {  
    int t;  
    int year, month, day, hour, minute, second;  
    int ampm;  

    scanf("%d", &t);  
    while(t--){  
        scanf("%d/%d/%d-%d:%d:%d", &year, &month, &day, &hour, &minute, &second);  

        if(hour >= 12)  
            ampm = 1;  
        else  
            ampm = 0;  
        if(hour == 0)  
            hour = 12;  
        else if(hour > 12)  
            hour -= 12;  

        printf("%02d/%02d/%04d-%02d:%02d:%02d%s\n", month, day, year, hour, minute, second, sampm[ampm]);  
    }  
    return 0;  
}  

E: 字母转转转 中等题
Solution:
主要考验大家的细心和编程能力,本身不要求什么算法和数据结构,大家代码都好长,而我利用了两个数组表示方向,起个名字就叫方向数组吧。

#include<cstdio>
#include<cstring>

using namespace std;

char str[1000][1000];

int main(){
    memset(str,0,sizeof(str));
    int dirx[4] = {1,0,-1,0};
    int diry[4] = {0,1,0,-1};
    int r, c, idx = 0, dir = 0;
    int now = 0, tot;
    int x = 1, y = 1;

    scanf("%d%d",&r,&c);
    tot = r*c;
    for(int i = 0; i <= c+1; ++i){
        str[0][i] = '#';  str[r+1][i] = '#';
    }
    for(int i = 0; i <= r+1; ++i){
        str[i][0] = '#';  str[i][c+1] = '#';
    }
    while(now < tot){
        str[y][x] = 'A'+idx;
        while(str[y+diry[dir]][x+dirx[dir]] != '\0' && now != tot-1)
            dir = (dir+1)%4;
        x += dirx[dir];  y += diry[dir];
        now++;  idx = (idx+1)%26;
    }
    for(int i = 1; i <= r; ++i){
        for(int j = 1; j <= c; ++j)
            printf("   %c",str[i][j]);
        printf("\n");
    }

    return 0;
}

F:汉诺塔 中等题
Solution :
代码不长,主要考验大家的递归思维能力。
//代码来源于网络

#include <stdio.h>  

__int64 bit[64] = {1};  
int flag ;  
void dfs(int a,int b,int c,int n,__int64 m)  
{  
    if(flag)  
        return ;  
    if(!n)  
        return ;  
    if(m > bit[n - 1])  
        dfs(b,a,c,n-1,m-bit[n-1]);  
    else if(m == bit[n-1])  
    {  
        printf("%d %d %d\n",n,a,c);  
        flag = 1;  
        return ;  
    }  
    else  
        dfs(a,c,b,n-1,m);  
}  
int main()  
{  
    for(int i = 1; i < 64; ++i)  
        bit[i] = bit[i - 1] << 1;  
    int n,t;  
    __int64 m;  
    scanf("%d",&t);  
    int a = 1, b = 2, c = 3;  
    while(t--)  
    {  

        scanf("%d%I64d",&n,&m);  
        flag  = 0;  
        dfs(a,b,c,n,m);  
    }  
    return 0;  
}  

G:萌萌哒数(水仙花数) 简单题
Solution:
经典问题,编程模拟过程即可,考验大家的基础编程能力,并且适应环境。

#include <iostream>  
using namespace std;  
int main(){  
    int m,n,i;  
    while(cin>>m>>n)  
    {  
        if (m > n)   
        {  
            int temp = m;  
            m = n;  
            n = temp;  
        }  
        bool flag = false;  
        int count = 0;  
        for (i = m; i <= n; i++)   
        {  
            int a,b,c,s = i;  
            a = s % 10;  
            s = s / 10;  
            b = s % 10;  
            s = s / 10;  
            c = s;  
            s = a * a * a +b * b * b +c * c * c;  
            if (s == i)   
            {  
                if (count != 0)  
                    cout<<" ";  
                cout<<i;  
                flag = true;  
                count++;  
            }  
        }  
        if (flag)  
            cout<<endl;  
        else  
            cout<<"no"<<endl;  
    }  
    return 0;  
}  

H:排序
Solution:
主要是让大家体会排序的编程思想,题目本身很简单,但是希望能从代码中看到大家手动实现的排序,通过对题目所给字符串的处理得到一些数字,然后对数字排序,关于排序我在另一篇博客中提到了计数排序等O(n)复杂度的排序,快排是(O(nlgn)级别),
http://blog.csdn.net/cFarmerReally/article/details/52123990?locationNum=1

#include <iostream>  
using namespace std;  
int comp(const void *a,const void *b)  
{  
    return *(int *)a-*(int *)b;  
}   
int main()  
{  
    int i, j, k, a[1000], acount;  
    char str[1001], temp[10];  
    while(cin>>str)  
    {  
        j = 0;  
        acount = 0;  
        k = strlen(str);  
        if (str[k-1] != '5')  
            str[k++] = '5';  
        for(i = 0; i < k; i++)  
        {  
            if(str[i] == '5')  
            {  
                if(j != 0)  
                {  
                    temp[j] = ' ';  
                    a[acount++] = atoi(temp);  
                    j = 0;  
                }  
            }  
            else  
                temp[j++] = str[i];  
        }  
        qsort(a, acount, sizeof(a[0]), comp);  
        for(i = 0; i < acount-1; i++)  
            cout<<a[i]<<" ";  
        cout<<a[acount-1]<<endl;  
    }  
    return 0;  
}  

希望大家能在这次模拟中有所收获,对环境充分熟悉,也希望大家最终能够取得好成绩

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值