解决C++ 遇笔试题输入[[1,2,3,...,],[5,6,...,],...,[3,1,2,...,]]问题

目录

  • [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 总结

其实可能有些笔试题不是很难,难在输入如何处理,不知道如何处理从而导致消耗了大量做其他题目时间,所以遇到困难的输入还是需要锻炼自己用代码记录一下并突破自己,下次遇到同样的输入情况就不会消耗大量时间。算是一种积累,以后可能会整个专栏存放一些不常见得输入。

这道笔试的题目题目描述是从矩阵的左上角寻找最优路径到达矩阵右下角(动态规划题)

这道题本身不难,就是有些时候真不知道处理输入会浪费大量时间,通过上面得处理就可以得到二维矩阵,然后就利用动态规划求出最短路径。

相关推荐
1024奇点5 小时前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
Warren2Lynch6 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
FlightYe6 小时前
视界原理之3D视频(四):裸眼、眼镜和头显
android·linux·c++·3d·ffmpeg·音视频
Knight_AL6 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
FRing037 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
by209997 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
砚底藏山河7 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
IT召唤狮8 小时前
开源企业级零信任项目Pangolin,零信任能挡住PHP核弹漏洞吗?
开发语言·开源·php
知已难寻8 小时前
03 · OpenStack的计算管理 Nova
运维·服务器·开发语言·云原生·云计算·openstack·开源软件
Rover Ramble8 小时前
C++ 用互斥锁实现读写锁
开发语言·c++