解决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 总结

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

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

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

相关推荐
笃励14 分钟前
Java面试题二
java·开发语言·python
jyan_敬言23 分钟前
【Linux】Linux命令与操作详解(一)文件管理(文件命令)、用户与用户组管理(创建、删除用户/组)
linux·运维·服务器·c语言·开发语言·汇编·c++
FL162386312926 分钟前
[C#]C# winform部署yolov11-pose姿态估计onnx模型
开发语言·yolo·c#
笑非不退37 分钟前
C++ 异步编程 并发编程技术
开发语言·c++
T0uken1 小时前
【QT Qucik】C++交互:接收QML信号
c++·qt·交互
爱写代码的刚子1 小时前
C++知识总结
java·开发语言·c++
martian6651 小时前
QT开发:基于Qt实现的交通信号灯模拟器:实现一个带有倒计时功能的图形界面应用
开发语言·qt
冷琴19961 小时前
基于java+springboot的酒店预定网站、酒店客房管理系统
java·开发语言·spring boot
缘友一世1 小时前
macOS .bash_profile配置文件优化记录
开发语言·macos·bash
tekin1 小时前
macos 中使用macport安装,配置,切换多版本php,使用port 安装php扩展方法总结
开发语言·macos·php·port·mac多版本php安装管理·port-select