【华为OJ】简单错误记录

来源:互联网 发布:python 读取文件跳过 编辑:程序博客网 时间:2024/06/05 08:46

我自己的代码没有通过,转载一下“静水流深”的代码:http://www.geekboy.org/huaweioj-five/

#include <iostream>#include <string>#include <queue> //queue容器using namespace std;struct Element {string name;string line;int count;};string *Output(string s,string result[])  //对于每一条记录输出结果{string purename,linenumber;if (s.find("\\")!=string::npos) //我没有考虑到这句判断{int position1=s.find_last_of("\\");int position2=s.find(" ",position1);purename=s.substr(position1+1,position2-position1-1);}else                        //输入只有文件名没有路径的情况下{int p=s.find_first_of(" ");purename=s.substr(0,p);}if (purename.size()>16)purename=purename.substr(purename.size()-16,16);   //得到净文件名int positionline=s.find_last_of(" ");linenumber=s.substr(positionline+1,s.size()-positionline-1);result[0]=purename;result[1]=linenumber;result[2]='1';return result;}int main(){string str;struct Element q[100];int num=0,k=0;vector< Element> final;while (getline(cin,str)){string tmp[3];Output(str,tmp);q[num].name=tmp[0];q[num].line=tmp[1];q[num].count=atoi(tmp[2].c_str());num++;}for (int i=0;i<num;i++){int flag=1;if (k<8){for (int j=0;j<k;j++){if (q[i].name==final[j].name && q[i].line==final[j].line){final[j].count++;flag=0;break;}}if(flag){final.push_back(q[i]);//q[0],k=1,i=1,若相等,final[0].count=2,记录条数k=1k++;}}else            //当第九个元素到达时(k==8)时{int flag=1;for (int j=0;j<k;j++){if (q[i].name==final[j].name && q[i].line==final[j].line){final[j].count++;flag=0;break;}}if(flag){final.erase(0+final.begin());//有新的错误记录出现,就删除最早的final.push_back(q[i]);}}}for (int i=0;i<final.size();i++)cout<<final[i].name<<" "<<final[i].line<<" "<<final[i].count<<endl;}

queue模板:这里头文件中虽然包含的是队列头文件,程序中实际上并没有运用,换成vector也一样

queue 模板类的定义在<queue>头文件中。
与stack 模板类很相似,queue 模板类也需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型。
定义queue 对象的示例代码如下:
queue<int> q1;
queue<double> q2;

queue 的基本操作有:
入队,如例:q.push(x); 将x 接到队列的末端。
出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q.front(),即最早被压入队列的元素。
访问队尾元素,如例:q.back(),即最后被压入队列的元素。
判断队列空,如例:q.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q.size()

这里使用queue最大的好处就是删除时是从栈顶删除的,我之前用的vector,pop_back()函数支持从栈底删除,应该写也是可以实现的,但是程序还是出了很多错,出现过循环中指针轮空的现象,修修或许还能用,最近时间太紧了,不能一点点去抠这些。找到工作以后,满满定下来好好打基础!

言归正传,这篇代码中灵活运用了string的各种函数,

s.find_last_of('\\'),直接返回最后一个\所在位置,

s.find(" ",position1),返回从position1开始查找空格在当前字符串中的位置
atoi(s.c_str()),将string转化成整型


代码比我自己的多两部分内容:

1、没有路径的情况 2、出错记录超过8的情况

另外关于记录重复情况:直接在已进栈的元素上修改,重复的不进栈,这样比起我想要在原来的数组里修改,都进栈再将重复的删除,要简洁清晰,而且我的方法是不对的,已进栈的数据,原来的数组变了,栈里的也不会变。这应该就是错误所在!

0 0