华为2016上机笔试题

开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。 
处理:
1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)
2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)
3.输入的文件可能带路径,记录文件名称不能带路径

思路

①首先字符串处理,有一个转义符误区,得到文件名和行数。然后定义一个map就行相同文件名和行数进行统计,map插入会改变输入顺序,这是第二个误区,需要一个辅助记录输入顺序。最后map转化结构题数组,进行结构体排序。

②结构体排序可以用sort和qsort,但是在本案例中qsort不能通过,我也不知什么个情况,注意cmp函数的返回会值(二者不同),已及决定升降序排序(刚好相反)。

作者:IIYMGF
来源:CSDN
原文:https://blog.csdn.net/hqh131360239/article/details/80968945
版权声明:本文为博主原创文章,转载请附上博文链接!

#include<iostream>
#include<string>
#include<stdlib.h>
#include<string.h>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
map<string,int> flag;//记录每个输入的顺序
int counts=0;
struct node{
	string x;
	int y;
};
int cmp(const node &a,const node &b)
{
	if(a.y==b.y)
		return flag[a.x]<flag[b.x]?1:0;
	return a.y>b.y?1:0;
}
int main()
{
	char a[1000];
	char b[100];
	set<string> s;//输入的集合
	map<string,int> ans;//存放结果
	while(cin>>a>>b)
	{
     int len=strlen(a);
	 int i=len-1;
	 for(;i>=0;i--)
	 {
		 if(a[i]=='\\')//转义字符
			 break;
	 }
	 string fn;
     for(i++;i<len;i++)
	 {
		 fn+=a[i];
	 }
	 fn+=" ";
	 fn+=b;//fn此时是记录的一个例子
	 if(s.find(fn)!=s.end())//set中存在相同记录
	 {
            ans[fn]=ans[fn]+1;//记录值个数加1
	 }
	 else{
		 counts++;//输入顺序数
		 flag[fn]=counts;
		 s.insert(fn);//加入set
		 ans[fn]=1;
	 }
	}
	node* p=(node*)malloc(counts*sizeof(node));
	int j=0;
	for(map<string,int>::iterator it=ans.begin();it!=ans.end();it++)
	{
             p[j].x=it->first;
			 p[j].y=it->second;
			 j++;
	}
	sort(p,p+counts,cmp);
	int num=0;
	for(int i=0;i<counts;i++)
	{
		int len=(p[i].x).length();
		int l;
		for(l=len-1;l>=0;l--)
		{
			if((p[i].x)[l]==' ')
				break;
		}
		if(l<=16)
		{
			cout<<p[i].x;
		}
		else{
			string q;
			for(int left=l-16;left<len;left++)
			{
				q+=(p[i].x)[left];
			}
			cout<<q;
		}
			cout<<" "<<p[i].y<<endl;
		    num++;
			if(num==8)
				break;
		}
		return 0;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值