华为OD机试 - Excel单元格数值统计(Python/JS/C/C++ 2024 E卷 200分)

news2024/11/26 20:33:48

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

Excel工作表中对选定区域的数值进行统计的功能非常实用。仿照Excel的这个功能,请你给定表格中区域中的单元格进行求和统计,并输出统计结果。

为简化计算,假设当前输入中每个单元格内容仅为数字或公式两种。

如果为数字,则是一个非负整数,形如3,77。
如果为公式,则固定以“=”开头,且包含以下三种情况:

  1. 等于某单元格的值,例如=B12;
  2. 两个单元格的双目运算(仅为+或-),形如=C1-C2,C3+B2;
  3. 单元格和数字的双目运算(仅为+或-),形如=B1+1,100-B2。

注意:

公式内容都是合法的,例如不存在=,=C+1,=C1-C2+B3=5,=3+5;
不存在循环引用,例如A1=B1+C1,C1=A1+B2;
内容中不存在空格、括号。

二、输入描述

第一行两个整数rows、cols,表示给定表格区域的行数和列数,1<=rows<=20,1<=cols<=26。
接下来rows行,每行cols个以空格分隔的字符串values,表示表格values的单元格内容。
最后一行给出一个字符串,表示给定的统计区域,形如A1

三、输出描述

一个整数,表示给定选定区域中单元格数字的累加总和,范围为-2,147,483,648 ~ 2,147,483,647。

四、测试用例

1、输入

1 3
1 =A1+C1 3
A1:C1

2、输出

8

3、说明

A1 = 1
B1 = A1 + C1 = 1 + 3 = 4
C1 = 3
总和 = 1 + 4 + 3 = 8

五、解题思路

题目要求对Excel工作表中选定区域的单元格进行求和统计。每个单元格的内容可能是一个数字或一个公式。

具体步骤

  1. 输入处理:
    • 读取表格的行数和列数。
    • 读取每个单元格的内容,并存储在一个二维数组中。
    • 读取需要统计的区域范围。
  2. 区域解析:
    • 解析统计区域的起始和结束单元格,例如“A1
    • ”表示从A1到C1的所有单元格。
    • 将单元格的字母部分(列)转换为数字索引,数字部分(行)转换为数组索引。
  3. 单元格值计算:
    • 对于每个单元格,如果是数字,直接取其值。
    • 如果是公式,需要解析公式并计算其结果。公式可能涉及其他单元格的值或直接的数值运算。
    • 使用递归或记忆化递归来处理公式中引用的单元格,避免重复计算。
  4. 求和:
    • 遍历选定区域内的所有单元格,计算每个单元格的值并累加。
  5. 输出结果。

六、Python算法源码

import sys

# 定义全局变量
table = []  # 存储表格内容的二维列表
memo = {}   # 记忆化存储已计算的单元格值
rows = 0    # 表格的行数
cols = 0    # 表格的列数

def cell_to_index(cell):
    """
    将单元格标识转换为行列索引
    例如:'A1' -> (0, 0)
    """
    col = 0
    i = 0
    # 处理列(字母部分)
    while i < len(cell) and cell[i].isalpha():
        col = col * 26 + (ord(cell[i].upper()) - ord('A') + 1)
        i += 1
    # 处理行(数字部分)
    row = int(cell[i:]) - 1
    return (row, col - 1)

def index_to_cell(row, col):
    """
    将行列索引转换为单元格标识
    例如:(0, 0) -> 'A1'
    """
    cell = ""
    col += 1
    while col > 0:
        rem = (col - 1) % 26
        cell = chr(ord('A') + rem) + cell
        col = (col - 1) // 26
    cell += str(row + 1)
    return cell

def evaluate(row, col):
    """
    计算指定单元格的值
    """
    cell = index_to_cell(row, col)
    # 如果已经计算过,直接返回记忆化的值
    if cell in memo:
        return memo[cell]
    
    content = table[row][col]
    if not content.startswith('='):
        # 如果是数字,直接转换为整数
        value = int(content)
    else:
        # 如果是公式,解析并计算表达式
        expr = content[1:]  # 去掉 '='
        value = evaluate_expression(expr)
    
    # 记忆化存储计算结果
    memo[cell] = value
    return value

def evaluate_expression(expr):
    """
    解析并计算表达式
    支持单个操作符 '+' 或 '-'
    """
    # 查找运算符的位置
    op_pos = -1
    op = ''
    for i, char in enumerate(expr):
        if char in ['+', '-']:
            op_pos = i
            op = char
            break
    if op_pos == -1:
        # 没有运算符,可能是单元格引用或数字
        return parse_term(expr)
    else:
        # 分割表达式为左半部分和右半部分
        left = expr[:op_pos]
        right = expr[op_pos+1:]
        left_val = parse_term(left)
        right_val = parse_term(right)
        if op == '+':
            return left_val + right_val
        else:
            return left_val - right_val

def parse_term(term):
    """
    解析单个项,可能是单元格引用或数字
    """
    if term[0].isalpha():
        # 如果是单元格引用,递归计算其值
        row, col = cell_to_index(term)
        return evaluate(row, col)
    else:
        # 如果是数字,直接转换为整数
        return int(term)

def main():
    global rows, cols, table
    # 读取输入
    input = sys.stdin.read().splitlines()
    # 第一行:行数和列数
    rows, cols = map(int, input[0].split())
    # 读取表格内容
    table = []
    for i in range(1, rows + 1):
        table.append(input[i].split())
    # 读取统计区域
    range_str = input[rows + 1]
    cells = range_str.split(':')
    start = cell_to_index(cells[0])
    end = cell_to_index(cells[1])
    # 计算总和
    total = 0
    for r in range(start[0], end[0] + 1):
        for c in range(start[1], end[1] + 1):
            total += evaluate(r, c)
    # 输出结果
    print(total)

if __name__ == "__main__":
    main()

七、JavaScript算法源码

const readline = require('readline');

// 创建接口以读取输入
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let input = [];
rl.on('line', function(line){
    input.push(line);
}).on('close', function(){
    // 开始处理输入
    let index = 0;
    // 读取行数和列数
    let [rows, cols] = input[index++].split(' ').map(Number);
    // 读取表格内容
    let table = [];
    for(let i=0; i<rows; i++){
        table.push(input[index++].split(' '));
    }
    // 读取统计区域
    let range = input[index++].trim();
    let cells = range.split(':');
    let start = cellToIndex(cells[0]);
    let end = cellToIndex(cells[1]);
    // 初始化记忆化存储
    let memo = new Map();
    // 计算总和
    let total = 0;
    for(let r = start.row; r <= end.row; r++){
        for(let c = start.col; c <= end.col; c++){
            total += evaluate(r, c);
        }
    }
    // 输出结果
    console.log(total);

    // 函数定义
    function cellToIndex(cell){
        let col = 0;
        let i = 0;
        while(i < cell.length && /[A-Z]/.test(cell[i])){
            col = col * 26 + (cell.charCodeAt(i) - 'A'.charCodeAt(0) + 1);
            i++;
        }
        let row = parseInt(cell.substring(i)) - 1;
        return {row: row, col: col - 1};
    }

    function indexToCell(row, col){
        let cell = "";
        col +=1;
        while(col >0){
            let rem = (col -1) %26;
            cell = String.fromCharCode('A'.charCodeAt(0) + rem) + cell;
            col = Math.floor((col -1)/26);
        }
        cell += (row +1).toString();
        return cell;
    }

    function evaluate(row, col){
        let cell = indexToCell(row, col);
        if(memo.has(cell)){
            return memo.get(cell);
        }
        let content = table[row][col];
        let value = 0;
        if(!content.startsWith('=')){
            value = parseInt(content);
        }
        else{
            let expr = content.substring(1);
            value = evaluateExpression(expr);
        }
        memo.set(cell, value);
        return value;
    }

    function evaluateExpression(expr){
        let opPos = -1;
        let op = '';
        for(let i=0; i<expr.length; i++){
            if(expr[i] === '+' || expr[i] === '-'){
                opPos = i;
                op = expr[i];
                break;
            }
        }
        if(opPos === -1){
            return parseTerm(expr);
        }
        else{
            let left = expr.substring(0, opPos);
            let right = expr.substring(opPos+1);
            let leftVal = parseTerm(left);
            let rightVal = parseTerm(right);
            return op === '+' ? leftVal + rightVal : leftVal - rightVal;
        }
    }

    function parseTerm(term){
        if(/[A-Z]/.test(term[0])){
            let idx = cellToIndex(term);
            return evaluate(idx.row, idx.col);
        }
        else{
            return parseInt(term);
        }
    }
});

八、C算法源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAX_ROWS 20
#define MAX_COLS 26
#define MAX_CELL_LEN 100
#define MAX_EXPR_LEN 1000

// 定义表格内容
char table[MAX_ROWS][MAX_COLS][MAX_CELL_LEN];
// 记忆化存储单元格值,初始化为未计算状态
long long memo_val[MAX_ROWS][MAX_COLS];
int memo_flag[MAX_ROWS][MAX_COLS] = {0};

// 表格的行数和列数
int rows, cols;

// 将单元格标识转换为行列索引
void cell_to_index(char *cell, int *row, int *col){
    *col = 0;
    int i = 0;
    // 处理列(字母部分)
    while(cell[i] && isalpha(cell[i])){
        *col = (*col) * 26 + (toupper(cell[i]) - 'A' + 1);
        i++;
    }
    // 处理行(数字部分)
    char num_part[MAX_CELL_LEN];
    int j = 0;
    while(cell[i]){
        num_part[j++] = cell[i++];
    }
    num_part[j] = '\0';
    *row = atoi(num_part) -1;
    *col = *col -1;
}

// 将行列索引转换为单元格标识
void index_to_cell(int row, int col, char *cell){
    cell[0] = '\0';
    col +=1;
    char temp[10];
    while(col >0){
        int rem = (col -1) %26;
        char c = 'A' + rem;
        sprintf(temp, "%c", c);
        strcat(cell, temp);
        col = (col -1) /26;
    }
    char row_str[10];
    sprintf(row_str, "%d", row +1);
    strcat(cell, row_str);
}

// 解析并计算表达式
long long evaluate_expression(char *expr);

// 解析单个项,可能是单元格引用或数字
long long parse_term(char *term){
    if(isalpha(term[0])){
        int r, c;
        cell_to_index(term, &r, &c);
        return evaluate(r, c);
    }
    else{
        return atoll(term);
    }
}

// 计算单元格的值
long long evaluate(int row, int col){
    // 如果已经计算过,直接返回
    if(memo_flag[row][col]){
        return memo_val[row][col];
    }
    char *content = table[row][col];
    long long value =0;
    if(content[0] != '='){
        // 直接是数字
        value = atoll(content);
    }
    else{
        // 是公式,解析并计算表达式
        char expr[MAX_EXPR_LEN];
        strcpy(expr, content +1); // 去掉 '='
        value = evaluate_expression(expr);
    }
    // 记忆化存储
    memo_val[row][col] = value;
    memo_flag[row][col] =1;
    return value;
}

// 解析并计算表达式
long long evaluate_expression(char *expr){
    int op_pos = -1;
    char op = 0;
    // 查找运算符的位置
    for(int i=0; i<strlen(expr); i++){
        if(expr[i] == '+' || expr[i] == '-'){
            op_pos = i;
            op = expr[i];
            break;
        }
    }
    if(op_pos == -1){
        // 没有运算符,可能是单元格引用或数字
        char term[MAX_CELL_LEN];
        strcpy(term, expr);
        return parse_term(term);
    }
    else{
        // 分割表达式为左半部分和右半部分
        char left[MAX_CELL_LEN];
        strncpy(left, expr, op_pos);
        left[op_pos] = '\0';
        char right[MAX_CELL_LEN];
        strcpy(right, expr + op_pos +1);
        long long left_val = parse_term(left);
        long long right_val = parse_term(right);
        if(op == '+'){
            return left_val + right_val;
        }
        else{
            return left_val - right_val;
        }
    }
}

int main(){
    // 读取行数和列数
    scanf("%d %d", &rows, &cols);
    // 读取表格内容
    for(int i=0; i<rows; i++){
        for(int j=0; j<cols; j++){
            scanf("%s", table[i][j]);
        }
    }
    // 读取统计区域
    char range[20];
    scanf("%s", range);
    // 解析统计区域的起始和结束单元格
    char *token = strtok(range, ":");
    char start_cell[MAX_CELL_LEN];
    char end_cell[MAX_CELL_LEN];
    strcpy(start_cell, token);
    token = strtok(NULL, ":");
    strcpy(end_cell, token);
    int start_r, start_c, end_r, end_c;
    cell_to_index(start_cell, &start_r, &start_c);
    cell_to_index(end_cell, &end_r, &end_c);
    // 计算总和
    long long total =0;
    for(int r=start_r; r<=end_r; r++){
        for(int c=start_c; c<=end_c; c++){
            total += evaluate(r, c);
        }
    }
    // 输出结果
    printf("%lld\n", total);
    return 0;
}

九、C++算法源码

#include <bits/stdc++.h>
using namespace std;

// 定义表格内容
vector<vector<string>> table;
// 记忆化存储单元格值
long long memo_val[21][27];
bool memo_flag[21][27];

// 表格的行数和列数
int rows, cols;

// 将单元格标识转换为行列索引
pair<int, int> cell_to_index(string cell){
    int col =0;
    int i=0;
    // 处理列(字母部分)
    while(i < cell.size() && isalpha(cell[i])){
        col = col *26 + (toupper(cell[i]) - 'A' +1);
        i++;
    }
    // 处理行(数字部分)
    int row = stoi(cell.substr(i)) -1;
    return {row, col -1};
}

// 将行列索引转换为单元格标识
string index_to_cell(int row, int col){
    string cell = "";
    col +=1;
    while(col >0){
        int rem = (col -1) %26;
        cell = char('A' + rem) + cell;
        col = (col -1)/26;
    }
    cell += to_string(row +1);
    return cell;
}

// 解析并计算表达式
long long evaluate_expression(string expr);

// 解析单个项,可能是单元格引用或数字
long long parse_term(string term){
    if(isalpha(term[0])){
        pair<int, int> idx = cell_to_index(term);
        return evaluate(idx.first, idx.second);
    }
    else{
        return stoll(term);
    }
}

// 计算单元格的值
long long evaluate(int row, int col){
    // 如果已经计算过,直接返回
    if(memo_flag[row][col]){
        return memo_val[row][col];
    }
    string content = table[row][col];
    long long value =0;
    if(content[0] != '='){
        // 直接是数字
        value = stoll(content);
    }
    else{
        // 是公式,解析并计算表达式
        string expr = content.substr(1); // 去掉 '='
        value = evaluate_expression(expr);
    }
    // 记忆化存储
    memo_val[row][col] = value;
    memo_flag[row][col] = true;
    return value;
}

// 解析并计算表达式
long long evaluate_expression(string expr){
    int op_pos = -1;
    char op = 0;
    // 查找运算符的位置
    for(int i=0; i<expr.size(); i++){
        if(expr[i] == '+' || expr[i] == '-'){
            op_pos = i;
            op = expr[i];
            break;
        }
    }
    if(op_pos == -1){
        // 没有运算符,可能是单元格引用或数字
        return parse_term(expr);
    }
    else{
        // 分割表达式为左半部分和右半部分
        string left = expr.substr(0, op_pos);
        string right = expr.substr(op_pos +1);
        long long left_val = parse_term(left);
        long long right_val = parse_term(right);
        if(op == '+'){
            return left_val + right_val;
        }
        else{
            return left_val - right_val;
        }
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    // 读取行数和列数
    cin >> rows >> cols;
    // 读取表格内容
    table.assign(rows, vector<string>(cols));
    for(int i=0; i<rows; i++){
        for(int j=0; j<cols; j++){
            cin >> table[i][j];
            memo_flag[i][j] = false;
        }
    }
    // 读取统计区域
    string range;
    cin >> range;
    // 解析统计区域的起始和结束单元格
    size_t pos = range.find(':');
    string start_cell = range.substr(0, pos);
    string end_cell = range.substr(pos +1);
    pair<int, int> start = cell_to_index(start_cell);
    pair<int, int> end = cell_to_index(end_cell);
    // 计算总和
    long long total =0;
    for(int r = start.first; r <= end.first; r++){
        for(int c = start.second; c <= end.second; c++){
            total += evaluate(r, c);
        }
    }
    // 输出结果
    cout << total << "\n";
    return 0;
}


🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2192921.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安可数据库产品目录

‌国家安可数据库产品目录包括以下主要产品‌&#xff1a; ‌华为GaussDB、openguass&#xff1a; 由华为云计算技术有限公司提供。‌金仓数据库管理系统&#xff1a;由中电科金仓&#xff08;北京&#xff09;科技股份有限公司提供。‌神通数据库管理系统&#xff1a;由天津神…

上学迟到问题

刚看到这题时&#xff0c;我突然就有了思路。说起来挺可笑的当我写完这题后&#xff0c;并成功AC时&#xff0c;看着我那冗长的代码我陷入了深思&#xff0c;难道真的有必要写这么一长串吗? 这是我的代码 #include<stdio.h> int main(){int s,v,t;scanf("%d %d&q…

ROW_NUMBER

How to rewrite a query which uses the ROW_NUMBER() window function in versions 5.7 or earlier before window functions were supported e.g., SELECT ROW_NUMBER() OVER (PARTITION BY fieldA) AS rownum, myTable.* FROM myTable; index 用不上的 Solution Assuming…

Linux高阶——0928—Github数据上传markdown语言

1、Github三要素 仓库、提交、分支 提交 绿色&#xff1a;新加 红色&#xff1a;删除 主分支master或main 项目的存储单位——仓库 实际代码的存储单位——分支 分支的协同开发 2、本地数据上传到云端的过程 3、markdown

OpenHarmony(鸿蒙南向开发)——轻量和小型系统三方库移植指南(一)

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 本文为OpenHarmony开发者提供一些组织编译形式比较常见&…

【C/C++】错题记录(四)

题目一 一个函数可以有很多个返回值&#xff08;有很多个return语句&#xff09;&#xff0c;但是最终只能有一个return语句执行。 题目二 题目三 题目四 题目五 程序数据结构算法 题目六 题目七 题目八 题目九 D选项是语句……

leetcode第189题:轮转数组(C语言版)

思路1&#xff08;不推荐&#xff09; 保存数组最后一个元素&#xff0c;然后数组全体元素后移一位&#xff0c;把保存的最后一个元素存放到数组的第一个位置&#xff0c;重复这一操作&#xff0c;直到执行完了k次。 时间复杂度&#xff1a;需要用k次循环&#xff0c;里面套一层…

【2024】前端学习笔记14-JavaScript常用数据类型-变量常量

学习笔记 1.JavaScript常用数据类型1.1.Number&#xff08;数字&#xff09;1.2.String&#xff08;字符串&#xff09;1.3.Boolean&#xff08;布尔值&#xff09;1.4.Null&#xff08;空值&#xff09;1.5.Undefined&#xff08;未定义&#xff09;1.6.Object&#xff08;对象…

从WIFI到NB-IoT,探秘智能门锁的高科技接入方式

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hello大家好!我是小米,一个29岁、活力满满、热爱分享技术的小米!今天,我想和大家聊聊一个与智能家居密切相关的技术话题——智能门锁的接入方式。无…

标准正态分布的数据 tensorflow 实现正态分布图,python 编程,数据分析和人工智能

import tensorflow as tf import matplotlib.pyplot as plt # 设置随机种子以获得可重复的结果 tf.random.set_seed(42) # 生成正态分布的数据 # mean0 和 stddev1 表示生成标准正态分布的数据 # shape(1000,) 表示生成1000个数据点 data tf.random.normal(mean0, stddev1, …

DOS 命令学习笔记

一、DOS 简介 DOS 是 Disk Operating System 的缩写&#xff0c;即磁盘操作系统。它是一种早期的计算机操作系统&#xff0c;用于管理计算机的硬件资源和软件资源&#xff0c;提供用户与计算机交互的界面。 二、基本 DOS 命令 &#xff08;一&#xff09;Dir 命令 功能&…

【汇编语言】寄存器(CPU工作原理)(二)—— 汇编指令的基础操作

文章目录 前言正文——&#xff08;一气呵成解决本文内容&#xff09;结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程的角度出发就太片面了&#xff0c;其实学习汇编语言可以深入理解计算机底…

YoloV8改进策略:BackBone改进|CAFormer在YoloV8中的创新应用,显著提升目标检测性能

摘要 在目标检测领域,模型性能的提升一直是研究者和开发者们关注的重点。近期,我们尝试将CAFormer模块引入YoloV8模型中,以替换其原有的主干网络,这一创新性的改进带来了显著的性能提升。 CAFormer,作为MetaFormer框架下的一个变体,结合了深度可分离卷积和普通自注意力…

【简码短链】使用Selenium实现UI自动化测试

1.环境准备 Chrome浏览器 版本为版本 129.0.6668.90&#xff08;正式版本&#xff09; &#xff08;64 位&#xff09; 129版本的Chrome浏览器的驱动,将webdriver放到jdk所在的bin目录下 在命令行中输入:chromedriver验证是否成功 打开IDEA,创建Maven项目,在pom.xml导入所需…

Gridview配置数据源--信任服务器证书

目录 背景过程Gridview配置数据源GridView与数据源&#xff1a;数据库连接与安全&#xff1a;信任服务器证书&#xff1a;配置信任服务器证书&#xff1a;注意事项&#xff1a; 生成连接字符串程序运行报错问题解决 总结 背景 Gridview配置数据源之后&#xff0c;程序报错 过…

前端编程艺术(4)---JavaScript进阶(vue前置知识)

目录 1.变量和常量 2.模版字符串 3.对象 4.解构赋值 1.数组的解构 2.对象的解构 5.箭头函数 6.数组和对象的方法 7.扩展运算符 8.Web存储 9.Promise 10.AsyncAwait 11.模块化 1.变量和常量 JavaScript 中的变量和常量是用于存储数据的标识符。变量可以被重新赋值&am…

[Linux] Linux 初识进程地址空间 (进程地址空间第一弹)

标题&#xff1a;[Linux] Linux初识进程地址空间 个人主页水墨不写bug &#xff08;图片来源于AI&#xff09; 目录 一、什么是进程地址空间 二、为什么父子进程相同地址的变量的值不同 三、初识虚拟地址、页表 一、什么是进程地址空间 其实&#xff0c;在很久之前&#xf…

数据结构之树(3)

一、森林和树的转换 重要&#xff01; 树->二叉树 由于孩子兄弟链式存储和二叉树链式存储本质相同&#xff0c;故树可转换为二叉树。 森林->二叉树 森林&#xff1a;m棵互不相交的树的集合 森林->树 树->二叉树 森林中各个树的根节点之间视为兄弟关系 二、树…

ORB-SLAM复现时遇到的问题(复现失败,切莫当做教程)

背景 本人的环境&#xff1a;使用ubuntu20.04&#xff0c;opencv4 问题 进行Build DBoW2. Go into Thirdparty/DBoW2/ and execute:时&#xff0c;运行make时出错 我安装的opencv4&#xff0c;在 OpenCV 3 和更高版本中&#xff0c;头文件的路径可能已更改。例如&#xff0…

科普篇--- 什么是硬件在环测试?

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…