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