0%

C++笔试中的获取数据问题

说明

最近做字节笔试的时候经常会出现一些数据解析的问题,比如输入”(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
#include <iostream>
#include <vector>
#include "GetData.h"
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
#include <iostream>
#include <vector>
#include <string>
#include "GetData.h"
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
#ifndef GETDATA_H
#define GETDATA_H

#include <iostream>
#include <vector>
#include <string>

using namespace std;

void GetData_Print(void);
bool isNumber(char tmp);
int GetData(string str);

#endif

测试结果

上面的已经是改的第二版了,已经完美支持负数的解析了,而且个人比较喜欢代码行数比较少,因此if里面很多的幅值部分就直接用都好隔开了,我知道不是一个好习惯,但是我个人看着的确好看写,勿喷勿喷。测是结果如下:2.2

可以看到已经解析了数据,但是其中有一个小问题,就是实际操作中判断符号哪里我用到了[i+1],如果测试代码中只有一个字符是会溢出的,但是笔试的用例好像没有这个情况,因为他们都是给的指定的输入,对这个还是比较放心的,只是做一个简单的分享吧。

-------------本文结束感谢您的阅读-------------