最近做了一道华为的笔试题,没有涉及到什么算法,就是很多细节很烦,和涉及到很多STL的操作,很多都忘了,现在重拾~
题目:
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)
2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)
3.输入的文件可能带路径,记录文件名称不能带路径
输入
E:\V1R2\product\fpgadrive.c 1325
输出
fpgadrive.c 1325 1
#include<iostream>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<string, int> PAIR; //定义文件名行号 和 次数
vector<PAIR> myvect;//用vector存储
//自己定义比较函数,返回次数从大到小排序
struct CmpByValue {
bool operator()(const PAIR& lhs, const PAIR& rhs) {
return lhs.second > rhs.second;
}
};
int main(){
string ss;
while(getline(cin,ss)){
if (ss.size() == 0) break;
int last = ss.size()-1;
int first;
for(int i = last;i>0;i--){
if(ss[i] == '\\'){
break;
}
else{
first = i;
}
}
string s = ss.substr(first,last);//截取文件名+行号,从字符串后面开始截取
//cout<<s<<endl;
vector<PAIR> ::iterator it;
bool isexist = false;
//插入到vector中
for(it = myvect.begin();it != myvect.end();++it){
if((*it).first == s){
(*it).second++;
isexist = true;
break;
}
}
if(it == myvect.end() && !isexist){
myvect.push_back(make_pair(s,1));
}
}
//题目中要求是稳定的,所以这里用stable_sort
stable_sort(myvect.begin(),myvect.end(),CmpByValue());
vector<PAIR> ::iterator it;
//输出结果
int count = 8;//只输出8条记录
for(it = myvect.begin();it != myvect.end();++it){
if(count == 0) break;
//控制文件名最大为后16个字符
string ss = (*it).first;
int find = ss.find(' ');
int head,len;
if(find >= 16){
head = find - 16;
len = 16;
}else{
head = 0;
len = find;
}
string filename = ss.substr(head,len);
string times = ss.substr(find+1);
cout<<filename<<" "<<times<<" "<<(*it).second<<endl;
count--;
}
}
这里涉及到几个string的函数
string substr(size_t pos = 0, size_t len = npos) const;
第一个参数是要截取的开始位置,第二个是要截取的长度(这个不要搞错了,不要以为是结束位置,一开始我以为是……)
string ss;
cin>>ss;
cout<<ss.substr(0,ss.size()-1)<<endl;
cout<<ss.substr(0)<<endl;
cout<<ss.substr(3,5)<<endl;
/*输出为
01234567890
0123456789
01234567890
34567
*/
关于find函数:
size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;
size_t find (const char* s, size_t pos, size_t n) const;
size_t find (char c, size_t pos = 0) const;
这个函数就是找到参数1出现位置,第二个参数是控制在pos位置以及之后去找
关于pair
//pair模板的定义
template <class T1, class T2> struct pair;
//构造赋值函数make_pair
template <class T1,class T2>
pair<T1,T2> make_pair (T1 x, T2 y)
{
return ( pair<T1,T2>(x,y) );
}
//访问成员
p.first;
p.second;
//example
#include <utility> // std::pair
#include <iostream> // std::cout
int main () {
std::pair <int,int> foo;
std::pair <int,int> bar;
foo = std::make_pair (10,20);
bar = std::make_pair (10.5,'A'); // ok: implicit conversion from pair<double,char>
std::cout << "foo: " << foo.first << ", " << foo.second << '\n';
std::cout << "bar: " << bar.first << ", " << bar.second << '\n';
return 0;
}
关于sort
stable_sort是保持稳定性的排序算法,在这道题里用的就是这个排序
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);