JD 2016年实习生笔试题

来源:互联网 发布:linux客户端是什么意思 编辑:程序博客网 时间:2024/06/03 01:32
第一次做公司的笔试题,各种不适应。写出程序也只有一个错误的表示,又不能调试,又不知道错误在哪,整个过程很纠结,感觉题目不难,但是限定时间调出来还是不容易,太渣了,后来记录整理下,记在这。第一题:小明想找班级分数最高的同学:输入学生的人数,再输入每位学生的分数和姓名,求最高分的学生姓名。输入:第一行输入正整数N,表示学生人数,接着输入N行,每行格式为:分数 姓名分数为非负整数,且小于等于100,;姓名为连续字符串,中间没有空格,长度不超过20数据保证有最高分的同学输出:最高分同学姓名。

这一题应该比较简单,但是当时我对cin不熟,平时都是直接写死的数据,并没有cin,然后当时想自己每次getline一行,又不记得它用法,又用了字符串流,自己把自己整复杂了。很坑的是每次答案错误只显示答案错误,什么提示信息都没有。哎。。。
以下是我写的代码,代码如下:

#include <iostream>#include <string>#include <algorithm>using namespace std;int main(){    int N;    cin>>N;    int i=0;    int array[N];    string str[N];    int score;    while(i<N)    {        cin>>score;        if(score>=0&&score<=100)        {            array[i]=score;            cin>>str[i];            i++;        }        else        {            cout<<"score must between 0 and 100!,Enter again!"<<endl;        }    }    int temp=0,maxscore=0;    for(i=0;i<N;i++)    {        if(array[i]>maxscore)        {            maxscore=array[i];            temp=i;        }    }    cout<<str[temp]<<endl;}

第二题:

给一个有数字字符’0’..’9’构成的字符串,写出它的p型编码串;
如122344111可写为一个1,2个2 1个32个4 3个1,即1122132431;

输入一行字符串,输出字符串对应的p型编码串。

这一题我被stringstream流给坑死了,
每次在重复使用同一个stringstream流时,下次使用要先清空它的缓存区,要不然所得到的数永远是之前那个。什么意思:

一般说来,人们对于清空流缓存区,想到的都是clear()函数,但是stringstream中clear()函数并不清空流的缓存区,只是重置了流的标志而已,如那种标志错误的标志类似的。在stringstream中调用.str(“”)清空流标志。
但是我自己在程序中测试(后面可以看到),我调用。str(“”)清流反而不行,我调用clear()还行。
在网上找到的解释:
那么把stringstream类内部的缓冲区正确的清空方式是什么呢?
stringstream ss;
答案是: ss.str(“”) 方法.
另外,如果需要把格式化后的字符串通过>>输出到字符串, 必须每次都调用clear()方法!
所以保险起见,以后清空流两个方法都用。
看代码:

#include <sstream>#include <stdio.h>using namespace std;int main(){    stringstream ss;    string result;    int n=1;    ss.clear();                                                                                                                                                                      ss<<n;    ss>>result;    printf("result : %s, str : %s\n", result.c_str(), ss.str().c_str());    n=2;    ss.clear();    ss<<n;    ss>>result;    printf("result : %s, str : %s\n", result.c_str(), ss.str().c_str());    n=3;    ss.str("");    ss<<n;    ss>>result;    printf("result : %s, str : %s\n", result.c_str(), ss.str().c_str());    n=4;    ss.clear();    ss.str("");    ss<<n;    ss>>result;    printf("result : %s, str : %s\n", result.c_str(), ss.str().c_str());}

测试结果:
result : 1, str : 1
result : 2, str : 12 // 调用了clear(), 没有调用str(“”), 结果错误.
result : 2, str : // 调用了 str(“”), 没有调用clear(), 结果错误.
result : 4, str : 4 // 调用了 clear()和str(“”), 结果正确.

回到正题,先说说我对第二题的代码:

#include <iostream>#include <string>#include <sstream>using namespace std;int main(){    string str;    string pstr="";    stringstream iss;    cin>>str;    int i,j;    string tempstr="";    for(i=0,j=0;i<str.size();)    {        iss.str("");        iss.clear();        while(j<str.size()&&str[i]==str[j])         {            j++;        }        iss<<(j-i);        iss>>tempstr;        pstr+=tempstr;        pstr+=str[i];        i=j;    }    cout<<pstr<<endl;}

也说了,中间就流的具体没弄清,导致程序错误,上述已经编译通过。

第三题:
给定一个含n个整数的数组,找出其中出现次数超过一半的数(数组中的数均大于-50小于50)
输入:
第一行一个整数n,表示数组大小
第二行输入n个数组元素
输出:
如果存在这样的数,输出;否则;输出0;

一看到这个题目,还是觉得比较简单的。因为它限定了数组中数的大小,所以定义一个数组
代码如下:

#include <iostream>using namespace std;int main(){    int n;    cin>>n;    int array[100]={0};    int i=0;    int num;    while(i<n&&cin>>num)    {//      cin>>num;        array[num+50]++;        i++;    }    for(i=0;i<100;i++)    {        if(array[i]>n/2)        {            cout<<i-50<<endl;            return 0;        }    }    cout<<"no"<<endl;}

哎,这题说多了都是泪,开始写的时候因为return 0没写,实际中找到的话也会输出no,但是在线编辑的时候又显示不了运行结果,只显示错误,好坑。

第四题:
小明想给n个瓶子涂亚瑟,相邻的瓶子颜色不一样,总共有三种颜色,分别为红,绿和蓝,由于瓶子大小,材质不同,不同瓶子涂不同颜色花费不一样,统计一下,把第i个瓶子涂红要Ri元,染绿要Gi元,染蓝药Bi元,现为了使相邻瓶子颜色不同,问 最少花费;
输入:
第一行:n 代表n个瓶子
第二行:n个整数,分别代表将第i个瓶子染红要Ri元
第三行:n个整数,分别代表将第i个瓶子染绿要Gi元
第四行:n个整数,分别代表将第i个瓶子染蓝要Bi元
输出:
最小花费

本题我考虑的可能是贪心算法吧,具体叫啥我也不知道。我的思路是:
考虑第n个瓶子,当它涂红时,在此情况下,要使它花费最少,那么第n-1个瓶子要么是绿,要么是蓝,选择其中的较小的,假如是绿,那如果第n-1个瓶子是绿的,且花费最小,那么就能保证当最后一个瓶子是红的,所有n个瓶子花费最少。当第n个是绿的或者蓝的同理。感觉说的不清楚,上代码吧,一看就知道了。

#include <iostream>#include <algorithm>using namespace std;int main(){    int n;    cin>>n;    int red[n],green[n],blue[n];    int i;    for(i=0;i<n;i++)    {        cin>>red[i];    }    for(i=0;i<n;i++)    {        cin>>green[i];    }    for(i=0;i<n;i++)    {        cin>>blue[i];    }    int sum[n][3];    sum[0][0]=red[0];    sum[0][1]=green[0];    sum[0][2]=blue[0];    for(i=1;i<n;i++)    {        sum[i][0]=min(sum[i-1][1],sum[i-1][2])+red[i];        sum[i][1]=min(sum[i-1][0],sum[i-1][2])+green[i];        sum[i][2]=min(sum[i-1][1],sum[i-1][0])+blue[i];    }    cout<<min(min(sum[n-1][0],sum[n-1][1]),sum[n-1][2])<<endl;}

小结:有限的时间写程序并调成功真的好难啊,而且就是只能在网页上自己用眼睛看的调,不能gdb或者用vs,真是。。。。心好累。。。

0 0