JD 2016年实习生笔试题

第一次做公司的笔试题,各种不适应。写出程序也只有一个错误的表示,又不能调试,又不知道错误在哪,整个过程很纠结,感觉题目不难,但是限定时间调出来还是不容易,太渣了,后来记录整理下,记在这。
第一题:
小明想找班级分数最高的同学:
输入学生的人数,再输入每位学生的分数和姓名,求最高分的学生姓名。
输入:
第一行输入正整数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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值