前两天做华为的题,结果太菜,当天结束后,把第一题自己终于做出来了。
我要吐槽一下华为,笔试前一个半小时通知笔试,还和我小米笔试冲突了,结果还做的不好。
第一道题:
输入字符串:A={1,3,5},B={2,4,6},R=1
输出为:(1,2)(3,4)(5,6)
解释:
1.A和B中值已经默认升序输入;
2.输出的点集,括号第一个是来自A,第二个来自B,且连个值的差不超过R;
3.第一个值小于第二个值;
4.当B中没有符合2和3中的值时,输出B中离A最近的值且满足3.
举个例子:
输入:A={11,13},B={12,16},R=1
输出:(11,12)(13,16)
看着挺简单的吧?当时死活没做出来。后来自己当天晚上发誓不做出来不回寝室。下面时我的代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//输入:A={11,13,15},B={12,14,16},R=1
//A={11,13},B={12,16},R=1
vector<int> convert(string s){
vector<int> nums;
int temp = 0;
for (int m = 0; m < s.size(); m++){
if (s[m] == ','){
nums.push_back(temp);
temp = 0;
}
else
temp = temp *10 + s[m] - '0';
if (m == (s.size() - 1)){
nums.push_back(temp);
}
}
return nums;
}
int main(){
string iputs;
cin >> iputs;
vector<int> A,B;
int R;
string as = "", bs = "", rs = "";
int flag = 0;
分别提取字符串
for (int i = 0; i < iputs.size(); i++){
if (iputs[i] == '{' && iputs[i - 2] == 'A'){
flag = 1;
continue;
}
if (iputs[i] == '{' && iputs[i - 2] == 'B'){
flag = 2;
continue;
}
if (iputs[i] == '=' && iputs[i - 1] == 'R'){
flag = 3;
i++;
}
if (flag == 1){
if (iputs[i] == '}'){
flag = 0;
continue;
}
as += iputs[i];
}
if (flag == 2){
if (iputs[i] == '}'){
flag = 0;
continue;
}
bs += iputs[i];
}
if (flag == 3){
rs += iputs[i];
}
}
//cout << as << ';' << bs << endl;
字符串转vector
A = convert(as);
B = convert(bs);
R = convert(rs)[0];
//进行题述输出
for (int m = 0; m < A.size(); m++){
int ff = 0;
for (int n = 0; n < B.size(); n++){
if ((A[m] < B[n]) && (A[m] + R >= B[n])){
ff = 1;
cout <<'(' << A[m]<<','<<B[n]<<')';
}
}
int q = 0;
while(ff == 0){
if (A[m] < B[q] && q < B.size()){
cout <<'(' << A[m]<<','<<B[q]<<')';
ff = 2;
}
q++;
if (q >= B.size()){
ff = 2;
}
}
//cout << '*';
}
return 0;
}