华为笔试题一

由于做完笔试后,回忆的题目,所以表达可能和原题有所出入,且事后没有case,所以不知程序鲁棒性高不高。

题目大体意思是这样,解析json文件

json内容类似于字典,输入字符串

{"fish":"blue","red":"reb"}

再输入fish显示blue,也就是说一个key对应一个val。

首先肯定需要解析字符串,我的思路是先按照字符‘,’分割,再按照字符串“\":\"”分割,再按照“\””分割,注意,\是转义,下面贴上我的代码,case没有全过。

#include<string>
#include<iostream>
#include<map>
#include<vector>
using namespace std;

vector<string> split(const string &s, const string &seperator) {
	vector<string> result;
	typedef string::size_type string_size;
	string_size i = 0;

	while (i != s.size()) {
		//找到字符串中首个不等于分隔符的字母;
		int flag = 0;
		while (i != s.size() && flag == 0) {
			flag = 1;
			for (string_size x = 0; x < seperator.size(); ++x)
				if (s[i] == seperator[x]) {
					++i;
					flag = 0;
					break;
				}
		}

		//找到又一个分隔符,将两个分隔符之间的字符串取出;
		flag = 0;
		string_size j = i;
		while (j != s.size() && flag == 0) {
			for (string_size x = 0; x < seperator.size(); ++x)
				if (s[j] == seperator[x]) {
					flag = 1;
					break;
				}
			if (flag == 0)
				++j;
		}
		if (i != j) {
			result.push_back(s.substr(i, j - i));
			i = j;
		}
	}
	return result;
}

int main()
{
	string input;
	map<string, string> mapJson;//c++map的用法,用来定义一个哈希表
	while (getline(cin, input))
	{
		if (input.empty())break;

		vector<string> json = split(input, "\,");//首先将字符串按照‘,’分割
		for (int i = 0; i < json.size(); i++)
		{
			int start, mid, end;
			start = json[i].find('\"');//找到字符串里面的第一个”
			mid = json[i].find("\":\"");//找到中间的位置
			end = json[i].rfind('\"');//找到最后的位置
			//cout << "start=" << start << "mid=" << mid << "end=" << end << endl;
			string key = json[i].substr(start + 1, mid - start - 1);
			string val = json[i].substr(mid + 3, end - mid - 3);
			//cout << key << " and " << val << endl;
			mapJson.insert(pair<string, string>(key, val));//加入哈希表
		}
		
		
	}
	string ok;
	getline(cin,ok);
	cout << mapJson[ok] << endl;
	system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hjxu2016/article/details/80942152
今日推荐