【华为OJ】简单错误记录

我自己的代码没有通过,转载一下“静水流深”的代码: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=1
				k++;
			}

		}
		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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值