华为2016校园招聘:简单错误记录
2016-07-20 11:00
323 查看
http://www.nowcoder.com/questionTerminal/67df1d7889cf4c529576383c2e647c48
[编程题]简单错误记录
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)
2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)
3.输入的文件可能带路径,记录文件名称不能带路径
输入描述:
输出描述:
输入例子:
输出例子:
用结构体存放记录,结构体记录文件名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
[编程题]简单错误记录
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
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
相关文章推荐
- 华为路由器密码恢复
- 华为交换机的后缀详解
- 华为RAID 1阵列卡设置教程图文详解
- 华为的IPD流程
- 华为手机真机调试设置
- 以华为为例告诉你HRBP 到底是什么?
- 华为OR小米,谁是智能手机出货量之王?
- 抢先小米!NFC支付又添一家 华为推出Huawei Pay
- 华为员工真实工资揭秘:十年青春才能换来百万年薪
- 深刻!一张图看懂在华为和腾讯工作的区别
- SE100101系统概述
- 华为防火墙配置演示 Quidway SecPath
- 华为防火墙地址转换
- 华为(VRRP-OSPF-STP-SNMP链路聚合)
- S9300做VRRP的配置
- 配置负载分担VRRP
- 华为9306(9300系列)在不删除配置的情况下恢复密码
- 思科和华为交换机常用命令对比学习
- 华为网络技术培训笔记之常用网络工具(一)