2015 年 华为机试题--简单的错误记录

传送门:https://www.nowcoder.com/practice/2baa6aba39214d6ea91a2e03dff3fbeb?tpId=37&tqId=21242&rp=0&ru=/ta/huawei&qru=/ta/huawei/question-ranking

题意:

开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。

 

处理: 

 

1、 记录最多8条错误记录,循环记录,对相同的错误记录(净文件名称和行号完全匹配)只记录一条,错误计数增加;

 (循环记录是指如果没有满八条, 数据后插, 满八条就前插, 输出最靠近前面的八条(如果有八条的话))

(路径不一样而文件名一样的也要相加)

(因为要看全文件名是否一样, 所以查询的时候不能取后16字符, 必须全部比较完成后才能取最后16字符)

(净文件名就是全长文件名)

2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;

 (注意是最后16个字符)

3、 输入的文件可能带路径,记录文件名称不能带路径。

因为要保证原来的输入顺序, 而map会自动按照key排序, 所以不能用map(map<string, int>),个人选择用vector+pair<>.

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <string>
using namespace std;
typedef pair<string, int> PAIR; 
int main(){
	string filename, line;
	char temp[105];
	vector<PAIR> st_vec;
	while(cin >> temp >> line){
		for(int i = 0;i < strlen(temp);++i){//去除路径
			if(temp[i] != '\\'){
	            filename += temp[i];
			}
	        else {
		        filename = "";
			}
		}
		filename += " ";
		filename += line;
		bool isexit = false;//是否已经存在
		int k;
		for(k = 0;k < st_vec.size(); ++k){
			if(st_vec[k].first == filename){
				isexit = true;
				break;
			}
	    } 
		if(isexit == true){
			st_vec[k].second ++; 
		}
		else if(st_vec.size() >= 8)
		    st_vec.insert(st_vec.begin(), PAIR(filename, 1));
		else 
			st_vec.push_back(PAIR(filename, 1));  
	}
		string name;  
		int cnt;
		cnt = st_vec.size() > 8 ? 8 : st_vec.size();
		if(cnt >=8 ){逆序输出
      for (int i = cnt-1;i >= 0 ; --i) {  
	    	int j;
	    	name = st_vec[i].first;
	    	for(j = 0;;++j){
	    		if(name[j] == ' ') break;
			}
	    	if(j > 15)
	    	    name = st_vec[i].first.substr(j-16, st_vec[i].first.size() - (j-16));
        	cout << name << " " << st_vec[i].second << endl;   
   		}
	}
	else{//顺序输出    写的太丑了
		for (int i = 0;i <cnt ; ++i) {  
	    	int j;
	    	name = st_vec[i].first;
	    	for(j = 0;;++j){
	    		if(name[j] == ' ') break;
			}
	    	if(j > 15)
	    	    name = st_vec[i].first.substr(j-16, st_vec[i].first.size() - (j-16));
        	cout << name << " " << st_vec[i].second << endl;   
   		}
	}
	return 0;

最后输出的时候写的太繁杂, 就是为了处理有没有8组数据, 如果有人能帮我化简的话我会非常开心的。

给一组测试数据


测试用例:
C:\gtu\vcy\jk\zwthkipl 636 G:\rsle\lsax\yalcxu\vwhysms 637 F:\fzqz 640 E:\lswb\styce\thjnbxdvg 645 F:\up\qflvvayylipvj 635 C:\pivw\rkd 644 E:\tlkbjb\pcvnvm\qh\fzqz 633 E:\ezke\xvrdkuesnjerakzhs 641 E:\qflvvayylipvj 639 F:\ybpxk 644 G:\rfdr\faxpyhyznsssbo 630 E:\xktax\osekgaqy 646 C:\te 633 G:\albed\ffc\jclzfq\h 631 F:\zsshil\pkue\mazocurlwufmkkrw 635 E:\dmj\uefo\syabgm\qflvvayylipvj 643 F:\pgdiwvceluyzft 634 D:\xiqck\dta\lnh 639 E:\nu\nz\wwjpch\fzqz 650 E:\gfsahypjzwfglvou 644 G:\qh\thjnbxdvg 641 C:\cp\voause\mf\hebgpyzpyyybiywpv 632 E:\de\vet\vdooytekbghohqz 631 E:\cox\pvg\tlrlr 640 G:\hkc\fllkwmwlgiqahxbfs 638 E:\apjnogffvkwnv 637 E:\nldefh\ar\oqsb\uyobrilaabapini 630 F:\wgotle\ar\wgh\hebgpyzpyyybiywpv 639 G:\nrekjavm 634 C:\mvngfg\lfjnvz\xvrdkuesnjerakzhs 634 F:\exne\vh\kqh\fzqz 641 F:\lepvz 642 G:\qg\hcbh\uknyte\pgdiwvceluyzft 636 F:\ho\cn\uyobrilaabapini 637 E:\xbc\fzqz 642 G:\ju\nmdd\fzqz 643 G:\lzpmdx\rxp\ybpxk 629 D:\fc\lnh 629 D:\dsgvo\zwthkipl 631 G:\pujc\cgorfjzkqmnjathbiip 640 G:\vfhyp\cs\rrt 638 F:\oteh\ti\urajfw\tlrlr 636 C:\crdp\qwptjlorrmnv 642 D:\kcl\fqzs\zlm\pgdiwvceluyzft 640 G:\faxpyhyznsssbo 639 D:\swnhezhgdcwwbmkyqt 637 D:\azo\sry\faxpyhyznsssbo 633 C:\beqt\eh\dm\dlhehjccfdgrrzyj 642 F:\lepvz 635 
对应输出应该为:
tlrlr 636 1 qwptjlorrmnv 642 1 pgdiwvceluyzft 640 1 faxpyhyznsssbo 639 1 nhezhgdcwwbmkyqt 637 1 faxpyhyznsssbo 633 1 dlhehjccfdgrrzyj 642 1 lepvz 635 1 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值