一个文件,两列,多行。
第一列是字母,第二列是数字,同列数据之间通过空格分割。
统计首列字母相同的第二列之和。
样例输入:
A 5
B 6
OO 7
A 6
A 2
OO 2
输出:
A:13
B:6
OO:9
面试官要求30分钟内实现,python,C++实现。
夸下5分钟写完一种语言海口的我花了18分钟睡觉……(晕)
然后开始整理思路,一开始写了很久vector+查找算法的(因为考虑map插入会导致覆盖),写了半天发现……太复杂了,而且查找算法确实应用的不熟练。后来转变一下思路map可以取出原来的值再加进去。。我去
捡起来半生不熟的map用法。。
思路就是:整个数据看作key-value结构,map的特性就是如果找一个不存在的,会自动插入并赋值默认值。value求和只需要找出对应key的map元素,取出当前的value(如果没有,int之类的默认是0),和新value相加后再塞回去。python直接利用字典这个结构即可。
1 #include<map> 2 #include<string> 3 #include<iostream> 4 #include<fstream> 5 #include<sstream> 6 7 using namespace std; 8 9 typedef double datatype; 10 11 template<typename T> 12 void Stringtoother(string str, T &result)//编写的模板函数供之后重用,实现字符串到任意类型(如果可以)的转换 13 { 14 istringstream is(str); 15 is >> result; 16 } 17 18 int main(int argc, char** argv) { 19 map<string, datatype> mp;//声明最终存储的map 20 21 ifstream in("D:\\test.txt");//测试样例,完全符合要求的情况下测试正常(未考虑文件出错的情况) 22 23 //ifstream in(argv[1]);//实际的路径,可以通过cmd读取 24 25 if (in.fail()) 26 { 27 cout << "文件打开失败!" << endl; 28 system("pause"); 29 return -1; 30 } 31 32 string s;//文件读取每一行存储到的字符串 33 mp.clear(); 34 while (getline(in, s)) 35 { 36 int tag = s.find(" "); 37 string temp1, temp2; 38 temp1 = s.substr(0, tag - 1); 39 temp2 = s.substr(tag + 1, s.size()); 40 41 int value = 0; 42 Stringtoother(temp2, value); 43 mp[temp1] += value;//键值先读取原来的,然后再相加后覆盖 44 45 } 46 47 map<string, datatype>::iterator it;//最终结果输出 48 for (it = mp.begin(); it != mp.end(); it++) { 49 cout << it->first << ":" << it->second << endl; 50 } 51 52 system("pause"); 53 return 0; 54 }
python实现
1 def readFile(path): 2 dict_data={} 3 with open(path,'r') as df: 4 for kv in [d.strip().split(' ') for d in df]: 5 temp=dict_data.get(kv[0],0) 6 dict_data[kv[0]]=float(kv[1])+temp 7 return dict_data; 8 9 test_data={} 10 test_data=readFile("D:\\test.txt") 11 print(test_data)
凉凉