目录
- [0 引言](#0 引言)
- [1 思路](#1 思路)
- [2 测试结果](#2 测试结果)
- [3 完整代码](#3 完整代码)
- [4 总结](#4 总结)
0 引言
现在面临找工作问题,做了几场笔试,遇到了一个比较棘手的题目就是题目输入形式如下:
[ [3,1,1], [3,5,3], [3,2,1] ]
当时遇到这个问题还是比较慌的,主要是之前没有遇到这样的输入可能是太菜没刷的题目少了,在这里记录一下自己解决此类问题的方法,还有一个目的就是集思广益,看看还有没有其他解法我想学习学习。
1 思路
以下为我个人解题思路,仅供参考,希望有大佬能在评论区给出你的妙招,无论什么编程语言都可以,主打一个一起学习!!!
- 首先:通过
getline(cin,s)
直接整行获取输入并存入字符串string s
中,将获得的字符s中[[
和,[
变为' ' (空字符)
,]]
变为]
,以上述为例:处理后结果为
3,1,1] 3,5,3] 3,2,1]
- 接着:使用
stringstream ss(s)
将字符串流分割字符串并存入数组,再使用getline(ss, token, ']')
意思就是遇到]
就将前面字符存入token
中,并且需要循环存放到token
中,接着上步结果处理得到
3,1,1
3,5,3
3,2,1
- 最后:使用一维vector存放行矩阵,用二维vector存放多行矩阵即可
话不多说直接上写好的函数代码:
cpp
vector<vector<int>> vcenums(string input) {
vector<vector<int>> array;
// 第一步:
for(int i = 0; i < input.size()-1; i++){
if((input[i+1] == '[' && input[i] == '[') || (input[i+1] == '[' && input[i] == ',')){
input[i] = ' ';
input[i+1] = ' ';
}else if(input[i+1] == ']' && input[i] == ']'){
input[i+1] = ' ';
}
}
input.erase(remove(input.begin(), input.end(), ' '), input.end());
// cout << input << endl; // 可以取消注释处理结果
// 将获取的数据存放到vector中
stringstream ss(input);
string token;
while (getline(ss, token, ']')) {
// cout << token << endl;
vector<int> row;
stringstream row_ss(token);
string element;
while (getline(row_ss, element, ',')) {
row.push_back(stoi(element));
}
array.push_back(row);
}
return array;
}
2 测试结果
测试用例输入:[[2,3,5,8,10],[11,2,1,5,4],[1,2,7,4,5],[6,9,0,1,4]]
3 完整代码
以下为完整代码仅供参考,如若有错欢迎提出,我及时更正
cpp
#include <iostream>
#include <vector>
#include <sstream>
#include <algorithm>
using namespace std;
vector<vector<int>> vcenums(string input) {
vector<vector<int>> array;
for(int i = 0; i < input.size()-1; i++){
if((input[i+1] == '[' && input[i] == '[') || (input[i+1] == '[' && input[i] == ',')){
input[i] = ' ';
input[i+1] = ' ';
}else if(input[i+1] == ']' && input[i] == ']'){
input[i+1] = ' ';
}
}
input.erase(remove(input.begin(), input.end(), ' '), input.end());
cout << input << endl;
// 使用字符串流分割字符串并存入数组
stringstream ss(input);
string token;
while (getline(ss, token, ']')) {
cout << token << endl;
vector<int> row;
stringstream row_ss(token);
string element;
while (getline(row_ss, element, ',')) {
row.push_back(stoi(element));
}
array.push_back(row);
}
return array;
}
int main() {
string s;
vector<vector <int>> M;
while(getline(cin,s)){
M = vcenums(s);
// 打印矩阵
for(auto nums : M){
for(auto i : nums){
cout << i << " ";
}
cout << endl;
}
}
return 0;
}
4 总结
其实可能有些笔试题不是很难,难在输入如何处理,不知道如何处理从而导致消耗了大量做其他题目时间,所以遇到困难的输入还是需要锻炼自己用代码记录一下并突破自己,下次遇到同样的输入情况就不会消耗大量时间。算是一种积累,以后可能会整个专栏存放一些不常见得输入。
这道笔试的题目题目描述是从矩阵的左上角寻找最优路径到达矩阵右下角(动态规划题)
这道题本身不难,就是有些时候真不知道处理输入会浪费大量时间,通过上面得处理就可以得到二维矩阵,然后就利用动态规划求出最短路径。