您的位置:首页 > 其它

华为2016校园招聘:简单错误记录

2016-07-20 11:00 323 查看
http://www.nowcoder.com/questionTerminal/67df1d7889cf4c529576383c2e647c48

[编程题]简单错误记录

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

处理:

1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)

2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)

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

输入描述:
一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。

文件路径为windows格式

如:E:\V1R2\product\fpgadrive.c 1325


输出描述:
将所有的记录统计并将结果输出,格式:文件名代码行数数目,一个空格隔开,如: fpgadrive.c 1325 1

结果根据数目从多到少排序,数目相同的情况下,按照输入第一次出现顺序排序。

如果超过8条记录,则只输出前8条记录.

如果文件名的长度超过16个字符,则只输出后16个字符


输入例子:
E:\V1R2\product\fpgadrive.c 1325


输出例子:
fpgadrive.c 1325 1


用结构体存放记录,结构体记录文件名path,行号line,次数和出现顺序index

先统计所有输入,存放进map,key=path+" "+line

再将map依据index拷贝到一个vector中,再根据要求排序。必须使用稳定的排序算法,这里采用快速插入排序

最后输出前8个

#include <iostream>
#include <vector>
#include <string>
#include <map>
using namespace std;
struct record
{
int n=1;
int index;//存放出现顺序
string path;
string line;
};
void sort(vector<record> &records)
{
int n=records.size(),j;
record rec;
for(int i=1;i<n;i++)
{
if(records[i].n>records[i-1].n)
{
j=i;
rec=records[i];
while(j>0&&records[j-1].n<rec.n)
{
records[j]=records[j-1];
j--;
}
records[j]=rec;
}
}
}
int main()
{
string path, line;
map<string, record> records;//key=path+" "+line
int i = 0;
while (cin >> path >> line)
{
path = path.substr(path.find_last_of('\\') + 1);
if (records.find(path + " " + line) == records.end())
{
//if(records.size()==8)
//break;
record rec;
rec.index = i++;
rec.path = path;
if (path.length()>16)
rec.path = path.substr(path.length() - 16 + 1, 16);
rec.line = line;
records[path + " " + line] = rec;
}
else
records[path + " " + line].n++;
}
//i就是当前记录的个数
vector<record> recordvec(i);
for (auto p : records)
recordvec[p.second.index] = p.second;
sort(recordvec);
i = i>8 ? 8 : i;
for (int j = 0; j<i; j++)
{
record rec = recordvec[j];
cout << rec.path << " " << rec.line << " " << rec.n << endl;
}
return 0;
}

也可以使用内置的排序算法
#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
struct record
{
int n=1;
int index;//存放出现顺序
string path;
string line;
};

bool compare(record a, record b)
{
return a.n > b.n;
}

int main()
{
string path, line;
map<string, record> records;//key=path+" "+line
int i = 0;
while (cin >> path >> line)
{
path = path.substr(path.find_last_of('\\') + 1);
if (records.find(path + " " + line) == records.end())
{
//if(records.size()==8)
//break;
record rec;
rec.index = i++;
rec.path = path;
if (path.length()>16)
rec.path = path.substr(path.length() - 16 + 1, 16);
rec.line = line;
records[path + " " + line] = rec;
}
else
records[path + " " + line].n++;
}
//i就是当前记录的个数
vector<record> recordvec(i);
for (auto p : records)
recordvec[p.second.index] = p.second;
stable_sort(recordvec.begin(),recordvec.end(), compare);
i = i>8 ? 8 : i;
for (int j = 0; j<i; j++)
{
record rec = recordvec[j];
cout << rec.path << " " << rec.line << " " << rec.n << endl;
}
return 0;
}

但是在牛客网上未能通过全部用例,只通过了50%。
提示的错误用例在本地运行是正确的,怀疑是牛客网的锅。不管了23333
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  华为