说明
最近做字节笔试的时候经常会出现一些数据解析的问题,比如输入”(1,2)”这种数据,要求提取其中的坐标,还有就是输入一长串数据,如”1 2 3 4 5”说是遗传数据,没有指定长度,前面一直死在数据的获取上面,可能半个小时都没有获取到数据,后面机制知道怎么做也不可能有通过率。后面进行了了一些小总结,有了后面的结果,也想做一个小小的开源分享吧。
思路
仔细分析上面的内容,发现两个点,一个使输入的长度不固定,而且数组的多少也不固定,因此没有办法用固定的方法去解析。
看了一下C++的常用数据类型,发现容器使可以很方便实现变长的类似数组功能,然后就是输入的数据,这个好办,直接输入字符串解析就好了,下面开写,具体代码如下。首先是main.c:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
using namespace std;
int main(void) { // cout << isNumber('.') <<endl; // GetData_Print();
string str; getline(cin, str); GetData(str); return 0; }
|
其次是GetData.cpp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
using namespace std;
void GetData_Print(void) { cout << "GetData test!" << endl; return ; }
bool isNumber(char tmp) { return ( (tmp >= '0') && (tmp <= '9') ) ? true : false; }
//从一行字符串获取相应的数据,解析到动态的容器中 int GetData(string str) { int i = 0, data = 0; bool update = false; //是否存储数据 int symbol = 1 ; //正负号的判定(+1或者-1) vector <int> array1; //存储不定长的数据 for(int i = 0; i < str.size(); i++) { if(str[i] == '-' && isNumber(str[i+1])) symbol = -1; else { if (str[i] >= '0' && str[i] <= '9') data = 10*data + (str[i] - '0'), update = true; else if(update) array1.push_back(symbol*data), data = 0, update = false, symbol = 1; if(update&&i == str.size() - 1)//需对字符串最后的数字进行判断 array1.push_back(symbol*data), symbol = 1; } } cout << "Result:" << endl; for(int j = 0; j < array1.size(); j++) cout << array1[j] << endl; return 0; }
|
最后是GetData.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
using namespace std;
void GetData_Print(void); bool isNumber(char tmp); int GetData(string str);
|
测试结果
上面的已经是改的第二版了,已经完美支持负数的解析了,而且个人比较喜欢代码行数比较少,因此if里面很多的幅值部分就直接用都好隔开了,我知道不是一个好习惯,但是我个人看着的确好看写,勿喷勿喷。测是结果如下:
可以看到已经解析了数据,但是其中有一个小问题,就是实际操作中判断符号哪里我用到了[i+1],如果测试代码中只有一个字符是会溢出的,但是笔试的用例好像没有这个情况,因为他们都是给的指定的输入,对这个还是比较放心的,只是做一个简单的分享吧。