当前位置: 首页 > news >正文

嵌入式开发面试典型编程题解析:排序算法、指针操作、字符处理、递归原理等基础原理的深度解析。

在嵌入式开发面试中,编程题是常见的考察形式,旨在检验求职者对基础编程知识的掌握和应用能力。以下是几道典型的嵌入式面试编程题及详细解析,帮助新手逐步理解和掌握相关知识点。

一、用交换法对学生成绩降序排序

题目描述

在嵌入式系统开发中,常需对数据进行排序处理。现给定一个存储学生成绩的数组 float score[],要求使用 交换法 按 成绩由高到低 重新排序,结果仍存放在该数组中。函数形参为 float score[](存储成绩的数组)和 int n(数组元素个数)。


解题思路

交换法排序的核心是通过两层循环遍历数组:

  • 外层循环:控制排序轮次,共需 n - 1 轮(n 为元素个数,如 4 个元素需 3 轮)。
  • 内层循环:将当前元素与后续元素逐一比较,若当前元素小于后续元素,则交换两者位置,确保每轮结束后,当前元素为范围内最大(降序)。

示例:对数组 [3.2, 5.1, 2.9] 排序

  • 第一轮:比较 3.2 和 5.1(交换,数组变为 [5.1, 3.2, 2.9]),再比较 5.1 和 2.9(不交换)。
  • 第二轮:比较 3.2 和 2.9(不交换)。
  • 最终数组:[5.1, 3.2, 2.9],完成降序排序。

代码实现

void Sort(float score[], int n) {  // 外层循环:控制排序轮次,共 n - 1 轮  for (int i = 0; i < n - 1; i++) {  // 内层循环:从 i + 1 开始,将 score[i] 与后续元素比较  for (int j = i + 1; j < n; j++) {  // 若当前元素小于后续元素,交换两者  if (score[i] < score[j]) {  float temp = score[i];  // 临时存储当前元素  score[i] = score[j];    // 后续元素移到当前位置  score[j] = temp;        // 原当前元素移到后续位置  }  }  }  
}  
代码解释
  • for (int i = 0; i < n - 1; i++):外层循环,i 表示当前轮次,n - 1 轮确保所有元素参与排序。
  • for (int j = i + 1; j < n; j++):内层循环,j 从 i + 1 开始,避免重复比较(如 i=0 时,j 从 1 开始比较 score[0] 和 score[1]score[0] 和 score[2] 等)。
  • if (score[i] < score[j]):判断当前元素是否小于后续元素,若是则交换。

知识点详解

  1. 交换法排序原理
    通过相邻元素的比较和交换,将较大值逐步 “上浮”(降序时)。每一轮循环确定一个元素的最终位置。

  2. 数组操作

  • 数组 score[] 存储成绩,通过下标 score[i]score[j] 访问元素。
  • 直接修改数组元素值(如 score[i] = score[j])实现数据交换。

  1. 循环嵌套

  • 外层循环控制轮次,内层循环控制每轮的比较次数。两者配合确保所有元素参与比较。

常见易错点

  1. 循环边界错误

  • 错误示例for (int i = 0; i < n; i++)(多一轮无意义循环)。
  • 正确逻辑n 个元素只需 n - 1 轮排序,如 3 个元素需 2 轮,因此外层循环条件为 i < n - 1

  1. 临时变量类型错误

  • 错误示例int temp = score[i];(若 score 是 float 类型,临时变量类型不匹配)。
  • 正确逻辑:临时变量 temp 需与数组元素类型一致,即 float temp = score[i];

  1. 交换逻辑错误

  • 错误示例:忘记中间变量,直接 score[i] = score[j]; score[j] = score[i];(这样会导致两个元素值相同)。
  • 正确逻辑:借助中间变量 temp 暂存值,再交换。

拓展知识

  1. 时间复杂度
    交换法排序的时间复杂度为 O(n2),适用于小规模数据。当数据量较大时,效率较低(如 n=1000 时,需约 100 万次比较)。

  2. 与其他排序算法对比

  • 冒泡排序:相邻元素比较交换,每一轮将最大(或最小)元素移到末尾,逻辑与交换法类似。
  • 选择排序:每一轮选择最小(或最大)元素与当前位置交换,减少交换次数但比较次数仍为 O(n2)。
  • 快速排序:平均时间复杂度 O(nlogn),通过分治思想提高效率,适合大规模数据(但实现较复杂)。

  1. 嵌入式场景应用
    在嵌入式系统中,若需对少量传感器数据(如温度、湿度值)排序,交换法简单易懂且资源消耗低;若处理大量数据(如图像像素值),则需选择更高效的算法。

通过这道题,新手可深入理解交换法排序的逻辑、数组与循环的配合,以及排序算法在嵌入式中的应用场景。实际开发中,需根据数据规模和资源限制选择合适的排序方法。

二、用指针作参数排序输出两整数

题目描述

在嵌入式编程中,指针的运用非常广泛。本题要求使用指针作为函数参数,对输入的两个整数按从大到小的顺序输出。通过指针操作,直接对实参进行修改,体现指针在数据处理中的高效性。

解题思路

  1. 定义一个函数,接收两个整数指针作为参数。
  2. 在函数内部,通过解引用指针获取指针指向的整数值,比较两个值的大小。
  3. 如果第一个值小于第二个值,交换两个指针所指向的数值。
  4. 在主函数中输入两个整数,调用该函数并输出排序后的结果。

代码实现

#include <stdio.h>  // 定义函数,参数为两个整数指针  
void sort_int(int *a, int *b) {  // 解引用指针,比较两个整数的大小  if (*a < *b) {  int temp = *a;  // 临时变量存储*a的值  *a = *b;        // 将*b的值赋给*a  *b = temp;      // 将临时变量的值赋给*b,完成交换  }  // 输出排序后的结果  printf("%d %d\n", *a, *b);  
}  int main() {  int num1, num2;  printf("请输入两个整数,用空格分隔:");  scanf("%d %d", &num1, &num2);  // 输入两个整数,&获取变量地址  sort_int(&num1, &num2);        // 传递变量的地址给函数  return 0;  
}  

知识点详解

  1. 指针作为函数参数
    • void sort_int(int *a, int *b):函数sort_int接收两个int类型的指针ab。指针作为参数传递的是变量的地址,这样在函数内部对指针所指向的值进行修改,会直接影响到主函数中的实参。
    • 例如,sort_int(&num1, &num2)num1num2的地址传递给函数,函数内对*a*b的操作就是对num1num2的操作。
  2. 解引用操作(*
    • *a*b表示获取指针ab所指向的内存单元中的值。在if (*a < *b)中,通过解引用比较两个指针指向的整数大小。
    • 交换数值时,*a = *b;b指向的值赋给a指向的内存单元,实现对实参num1的修改。
  3. 地址传递(&
    • scanf("%d %d", &num1, &num2);中,&用于获取num1num2的地址,以便scanf函数将输入的值存储到正确的内存位置。
    • 在函数调用sort_int(&num1, &num2);中,将num1num2的地址传递给函数sort_int,使函数能够操作这两个变量。

常见易错点

  1. 忘记解引用指针
    • 错误示例:if (a < b),这里ab是指针,比较的是地址值,而不是它们指向的整数大小。正确的做法是if (*a < *b),通过解引用获取指针指向的值进行比较。
  2. 参数传递时未取地址
    • 错误示例:sort_int(num1, num2);,这样传递的是num1num2的值,而不是地址,函数无法对主函数中的num1num2进行修改。正确的是sort_int(&num1, &num2);,传递变量的地址。
  3. 交换数值时逻辑错误
    • 错误示例:直接写*a = *b; *b = *a;,这样会导致两个指针指向的值最终相同。应该借助临时变量int temp = *a; *a = *b; *b = temp;来实现正确的交换。

拓展知识

  1. 指针的其他应用场景
    • 在嵌入式开发中,指针常用于操作硬件寄存器。例如,假设某个寄存器的地址是0x40000000,可以通过指针volatile int *reg_addr = (volatile int *)0x40000000;来访问和修改寄存器的值,*reg_addr = 0x1234;volatile关键字用于防止编译器优化,确保每次操作都是对实际内存地址的读写)。
    • 指针还用于动态内存分配,如int *dynamic_arr = (int *)malloc(10 * sizeof(int));,通过指针dynamic_arr操作动态分配的内存空间。
  2. 指针与函数返回值
    • 除了作为参数,指针还可以作为函数的返回值。例如,返回一个指向数组的指针,但要注意不能返回局部变量的指针(局部变量在函数结束后内存会被释放)。正确的做法是返回静态变量或动态分配内存的指针。
    • 示例:
int *get_array() {  static int arr[] = {1, 2, 3};  // 静态数组,生命周期与程序相同  return arr;  
}  

  1. 指针的类型转换
    • 在嵌入式中,有时需要进行指针类型转换。例如,将一个char类型指针转换为int类型指针。但要注意指针类型转换时的内存对齐和数据长度问题。
    • 示例:
char buffer[4] = {0x12, 0x34, 0x56, 0x78};  
int *ptr = (int *)buffer;  
int value = *ptr;  // 根据系统的字节序(大端或小端),value会得到不同的值  

通过这道题,新手可以深刻理解指针作为函数参数的作用和操作方法,这在嵌入式开发中至关重要。指针的正确使用能够提高程序的效率和灵活性,同时也需要注意避免常见的错误,确保程序的正确性。

三、判断字符类型(修改错误)

题目描述

在嵌入式开发中,经常需要对输入的字符进行类型判断,如判断是数字、字母、空格还是其他字符。以下程序存在错误,请找出并修正。

错误代码

void main() {  char ch;  ch = getchar();  if (ch >= 'a' || ch <= 'z' || ch >= 'A' || ch <= 'Z')  printf("It is an English character\n");  else if (ch >= '0' && ch <= '9')  printf("It is a digit character\n");  else if (ch ='')  printf("It is a space character\n");  else  printf("It is other character\n");  
}  

错误分析

  1. 字母判断条件错误
    原代码中 if (ch >= 'a' || ch <= 'z' || ch >= 'A' || ch <= 'Z'),逻辑运算符 ||(或)使用不当。例如,当 ch 是 '0' 时,ch <= 'z' 为真,会错误判断为字母。
    正确的应该是用 &&(与)来限定字母范围,即 (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')
  2. 空格判断错误
    else if (ch ='') 中 = 是赋值运算符,这里需要用 == 进行相等判断。

修正代码

#include <stdio.h>  
void main() {  char ch;  ch = getchar();  // 修正字母判断条件  if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))  printf("It is an English character\n");  else if (ch >= '0' && ch <= '9')  printf("It is a digit character\n");  // 修正空格判断条件  else if (ch =='')  printf("It is a space character\n");  else  printf("It is other character\n");  
}  

知识点详解

  1. 字符的 ASCII 码范围
    • 大写字母:'A' 到 'Z',ASCII 码值连续,可通过 ch >= 'A' && ch <= 'Z' 判断。
    • 小写字母:'a' 到 'z',同理用 ch >= 'a' && ch <= 'z' 判断。
    • 数字:'0' 到 '9',用 ch >= '0' && ch <= '9' 判断。
    • 空格:ASCII 码为 32,可直接用 ch ==' ' 判断。
  2. 逻辑运算符
    • &&(与):所有条件都为真,结果才为真。例如 (ch >= 'a' && ch <= 'z'),确保 ch 在小写字母范围内。
    • ||(或):只要有一个条件为真,结果就为真。如 (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'),只要满足小写或大写字母条件,就判断为字母。
  3. 关系运算符
    • == 是相等判断运算符,= 是赋值运算符。在条件判断中,必须用 == 来判断是否相等,如 ch ==' ' 是判断 ch 是否为空格,而 ch =' ' 是将空格赋值给 ch

常见易错点

  1. 逻辑运算符误用
    • 错误示例:用 || 连接字母范围,如 ch >= 'a' || ch <= 'z',这样会使很多非字母字符(如数字、符号)误判为字母。
    • 正确逻辑:用 && 限定每个范围,再用 || 连接大小写字母的判断条件。
  2. 相等判断用赋值运算符
    • 错误示例:else if (ch =''),这会将空格赋值给 ch,且条件恒为真(非零值)。
    • 正确逻辑:用 == 进行判断,即 else if (ch =='')

拓展知识

  1. 字符类型判断的其他方法
    • 可以使用 C 标准库函数 isalpha()isdigit()isspace() 等。例如:
#include <ctype.h>  
#include <stdio.h>  
void main() {  char ch;  ch = getchar();  if (isalpha(ch))  printf("It is an English character\n");  else if (isdigit(ch))  printf("It is a digit character\n");  else if (isspace(ch))  printf("It is a space character\n");  else  printf("It is other character\n");  
}  

  • 这些函数内部也是通过判断字符的 ASCII 码范围实现的,但使用库函数会使代码更简洁易读。

  1. 嵌入式中字符处理的应用
    • 在串口通信中,接收的数据通常是字符形式,需要判断字符类型来解析指令。例如,接收 'A' 表示某种操作,接收 '1' 表示另一种操作。
    • 在字符显示驱动中,需要判断字符类型来确定显示方式,如字母和数字的显示格式可能不同。
  2. ASCII 码表的深入理解
    • 了解 ASCII 码表中特殊字符的码值,如换行符 '\n'(ASCII 码 10)、回车符 '\r'(ASCII 码 13)等,在处理文本数据时很重要。例如,在解析文本文件时,遇到换行符需要进行换行操作。

通过这道题,新手可以掌握字符类型判断的正确方法,理解逻辑运算符和关系运算符的区别,同时了解相关库函数的应用。在嵌入式开发中,准确的字符类型判断是处理输入输出、协议解析等任务的基础。

四、求阶乘的递归函数

题目描述

编写一个递归函数,计算正整数 n 的阶乘(记为 n!)。阶乘的定义为:

  • 当 n = 0 或 n = 1 时,n! = 1
  • 当 n > 1 时,n! = n × (n-1)!
    函数形参为 int n,返回值为 n 的阶乘(类型为 int)。

解题思路

递归核心逻辑
  1. 基线条件(终止条件)
    当 n 为 0 或 1 时,直接返回 1,不再继续递归。
  2. 递归调用
    当 n > 1 时,通过 n * factorial(n-1) 调用自身,将问题规模缩小(从求 n! 转化为求 (n-1)!),直到满足基线条件。
示例计算过程

计算 3!

  • factorial(3) = 3 × factorial(2)
  • factorial(2) = 2 × factorial(1)
  • factorial(1) = 1(触发基线条件,开始回溯)
  • 回溯计算:2×1=2 → 3×2=6,最终返回 6。

代码实现

#include <stdio.h>  // 递归函数:计算n的阶乘  
int factorial(int n) {  // 基线条件:n为0或1时,阶乘为1  if (n == 0 || n == 1) {  return 1;  }  // 递归调用:n! = n × (n-1)!  else {  return n * factorial(n - 1);  }  
}  int main() {  int num = 5;  int result = factorial(num);  printf("%d! = %d\n", num, result);  // 输出:5! = 120  return 0;  
}  

知识点详解

1. 递归函数的定义
  • 递归:函数在执行过程中直接或间接调用自身的编程方式。
  • 两大要素
    • 基线条件:明确递归终止的条件(如 n == 0 || n == 1),避免无限递归。
    • 递归表达式:将原问题拆解为规模更小的同类子问题(如 n! = n × (n-1)!)。
2. 参数与返回值
  • 参数 n:表示待计算阶乘的正整数,需确保 n ≥ 0(实际开发中可添加输入校验)。
  • 返回值:类型为 int,存储阶乘结果。但需注意整数溢出问题(如 n=13 时,13! = 6227020800,超过 int 范围 2^31-1,需用 long long 类型)。
3. 递归调用的执行过程
  • 每次递归调用都会在内存栈中创建新的函数栈帧,保存当前函数的参数和局部变量。
  • 以 factorial(3) 为例,栈帧创建顺序:

    plaintext

    factorial(3) → factorial(2) → factorial(1)(触发基线条件,开始释放栈帧)  
    

    最终通过栈帧回溯计算出结果。

常见易错点

1. 缺少基线条件或条件错误
  • 错误示例
    int factorial(int n) {  return n * factorial(n - 1);  // 无基线条件,导致无限递归  
    }  
    
  • 后果:程序会因栈溢出(stack overflow)崩溃。
  • 修正:必须显式定义基线条件 if (n == 0 || n == 1) return 1;
2. 递归表达式错误
  • 错误示例
    return n * factorial(n + 1);  // 递归参数错误,问题规模增大  
    
  • 后果:参数 n 会无限增大,远离基线条件,导致栈溢出。
  • 修正:递归参数应为 n - 1,确保问题规模逐步缩小。
3. 整数溢出未处理
  • 错误场景:当 n ≥ 13 时,int 类型无法存储结果(32 位 int 最大值为 2147483647,而 13! = 6227020800)。
  • 修正:改用 long long 类型(64 位可存储到 20!):
    long long factorial(int n) {  if (n == 0 || n == 1) return 1;  else return n * factorial(n - 1);  
    }  
    

拓展知识

1. 递归 vs 迭代(循环)实现
特性递归迭代
代码复杂度简洁,符合数学定义稍繁琐,需手动处理循环逻辑
空间复杂度O (n)(栈帧空间)O (1)(仅需循环变量)
适用场景树 / 链表遍历、分治算法(如快速排序)大规模数据计算(避免栈溢出)

迭代实现示例

long long factorial_iterative(int n) {  long long result = 1;  for (int i = 2; i <= n; i++) {  result *= i;  // 从2累乘到n  }  return result;  
}  
2. 嵌入式开发中的递归注意事项
  • 栈空间限制:嵌入式系统内存资源有限,深层递归可能导致栈溢出(如单片机栈深度通常较小)。
    • 解决方案:优先使用迭代,或通过链接脚本增大栈空间(需谨慎)。
  • 输入校验:添加对 n < 0 的处理(阶乘定义中 n 为非负整数):
    long long factorial(int n) {  if (n < 0) {  return -1;  // 或报错,根据需求定义  }  if (n == 0 || n == 1) return 1;  else return n * factorial(n - 1);  
    }  
    
3. 阶乘的数学拓展
  • 0! 的定义:数学上规定 0! = 1,这是递归基线条件包含 n=0 的原因。
  • 大数阶乘:当 n 较大时(如 n ≥ 21),需用高精度计算(如数组存储每一位数字),常见于算法竞赛或数学库开发。

总结

通过递归实现阶乘,核心是理解基线条件和递归表达式的配合。新手需注意避免无限递归和整数溢出,同时掌握递归与迭代的适用场景。在嵌入式开发中,需根据硬件资源选择合适的实现方式,确保程序的稳定性和效率。

通过以上题目解析,希望能帮助新手全面理解嵌入式面试编程题的知识点、易错点及拓展应用,逐步提升编程能力。

相关文章:

嵌入式开发面试典型编程题解析:排序算法、指针操作、字符处理、递归原理等基础原理的深度解析。

在嵌入式开发面试中&#xff0c;编程题是常见的考察形式&#xff0c;旨在检验求职者对基础编程知识的掌握和应用能力。以下是几道典型的嵌入式面试编程题及详细解析&#xff0c;帮助新手逐步理解和掌握相关知识点。 一、用交换法对学生成绩降序排序 题目描述 在嵌入式系统开…...

DeepSeek+即梦:AI视频创作从0到1全突破

目录 一、开启 AI 视频创作大门&#xff1a;前期准备1.1 注册与登录1.2 熟悉工具界面1.3 硬件与网络要求 二、用 DeepSeek 构思视频脚本2.1 明确创作主题与目标2.2 编写优质提示词2.3 生成并优化脚本 三、即梦 AI 实现画面生成3.1 文生图基础操作3.2 调整参数提升画质3.3 保持人…...

npm init、换源问题踩坑

文章目录 一、 问题复现二、问题解决 一、 问题复现 成功安装nodejs 以及 npm 版本如下&#xff1a; > node -v > v20.18.0 > npm -v > 10.8.2使用 npm init 命令时延时过长&#xff0c;考虑换源&#xff0c;使用指令 npm config set registry https://registr…...

TRex 控制台命令解析

TRex 是一种高性能的网络测试工具&#xff0c;用于生成和分析网络流量。以下是对这些命令的简要解释&#xff1a; 一、help Console Commands&#xff08;控制台命令&#xff09; capture&#xff1a;管理 PCAP 捕获。debug&#xff1a;用于开发的内部调试器。events&#x…...

【Shell 脚本入门】轻松上手的实战指南

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Shell脚本编程 目录 一&#xff1a;&#x1f525; 什么是 Shell &#x1f98b; 常见的 Shell 类型 二&#xff1a;&#x1f525; 什么是 Shell 脚本 &#x1f98b; Shell 脚本规则&#x1f98b; 第…...

数据结构*栈

栈 什么是栈 这里的栈与我们之前常说的栈是不同的。之前我们说的栈是内存栈&#xff0c;它是JVM内存的一部分&#xff0c;用于存储局部变量、方法调用信息等。每个线程都有自己独立的栈空间&#xff0c;当线程启动时&#xff0c;栈就会被创建&#xff1b;线程结束&#xff0c…...

零基础制作Freertos智能小车(教程非常简易)持续更新中....

从现开始&#xff0c;将陆续推出各类简单的DIY电子设计&#xff0c;由简入深&#xff0c;将自己的制作过程全部分享出来&#xff0c;巩固自己知识的同时希望借此机会认识更多喜欢电子设计的小伙伴。 本次小车的主控芯片采用stm32f103c8t6&#xff0c;主要是便宜好用&am…...

Leetcode - 双周赛155

目录 一&#xff0c;3527. 找到最常见的回答二&#xff0c;3528. 单位转换 I三&#xff0c;3529. 统计水平子串和垂直子串重叠格子的数目四&#xff0c;3530. 有向无环图中合法拓扑排序的最大利润 一&#xff0c;3527. 找到最常见的回答 题目列表 本题是一道模拟题&#xff0…...

详解RabbitMQ工作模式之工作队列模式

目录 工作队列模式 概念 特点 应用场景 工作原理 注意事项 代码案例 引入依赖 常量类 编写生产者代码 编写消费者1代码 编写消费者2代码 先运行生产者&#xff0c;后运行消费者 先运行消费者&#xff0c;后运行生产者 工作队列模式 概念 在工作队列模式中&#x…...

QGIS+mcp的安装和使用

QGISmcp的安装和使用 安装qgis_mcp 下载qgis_mcp&#xff1a; git clone https://github.com/jjsantos01/qgis_mcp.git安装uv uv是一个由Rust语言编写的python包管理工具&#xff0c;旨在提供比传统工具&#xff08;如 pip&#xff09;更高效的依赖管理和虚拟环境操作。 p…...

Java基础361问第16问——枚举为什么导致空指针?

我们看一段代码 public enum Color {RED, BLUE, YELLOW;public static Color parse(String color) {return null;} }public static void main() {Color color Color.parse("");// 极具迷惑性&#xff0c;大家日常开发肯定这么写过switch (color) {case RED:break;c…...

在 C# .NET 中驾驭 JSON:使用 Newtonsoft.Json 进行解析与 POST 请求实战

JSON (JavaScript Object Notation) 已经成为现代 Web 应用和服务之间数据交换的通用语言。无论你是开发后端 API、与第三方服务集成&#xff0c;还是处理配置文件&#xff0c;都绕不开 JSON 的解析与生成。在 C# .NET 世界里&#xff0c;处理 JSON 有多种选择&#xff0c;其中…...

CentOS7——Docker部署java服务

1、安装Docker 首先要确保系统已安装 Docker&#xff0c;若未安装&#xff0c;可以参考我的另一篇文章现在CentOS7上安装Docker&#xff0c;文章地址如下&#xff1a; CentOS7系统安装Docker教程-CSDN博客 Docker当中要安装必备的软件&#xff0c;比如Java运行必要的JDK&#…...

Python-Part2-集合、字典与推导式

Python-Part2-集合、字典与推导式 1. set集合 ⽆序&#xff0c;去掉重复数据。 set1 {1,2,3,4,5,5,4,3,2,1}print(type(set1))print(set1)set2.add(66666)set2.remove(55)#不能使用下标访问set&#xff0c;所以修改操作一般为remove操作 add操作2.dict 字典 字典&#xff…...

《AI大模型应知应会100篇》第39篇:多模态大模型应用:文本、图像和音频的协同处理

第39篇&#xff1a;多模态大模型应用&#xff1a;文本、图像和音频的协同处理 摘要 随着人工智能技术的发展&#xff0c;多模态大模型&#xff08;Multimodal Large Models&#xff09;已经成为AI领域的热点之一。这些模型能够同时处理文本、图像、音频等多种模态数据&#xf…...

kvm学习小结

安装相关包 安装虚拟化相关包 apt install qemu-kvm qemu-system libvirt-clients libvirt-daemon-system vlan bridge-utils 安装界面相关包 apt install xinit gdmd 配置机器允许root登录 检查cpu是否支持虚拟化 egrep -o vmx|svm /proc/cpuinfo 执行命令systemctl s…...

k8s基本概念-YAML

YAML介绍 YAML是“YAML Aint a Markup Language” (YAML不是一种置标语言)的递归缩进写,早先YAML的意思其实是:“Yet Another Markup Language”(另一种置标语言) YAML是一个类似XML、JSON的标记性语言。YAML强调以数据为中心,并不是以标识语言为重点。因而YAML本身的定义…...

wps批注线条怎么取消去掉wps批注后有竖线

wps批注线条怎么取消去掉wps批注后有竖线 问题 图片 解决方案 图片 word批注线条取消的方法&#xff1a; 1.打开Word文档,点击需要删除的批注。 2.然后点击工具栏“审阅”选项。 3.接着点击“接受“ 4.接受对文档所做的所有修订(H)...

深度解析算法之分治(归并)

48.排序数组 题目链接 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题&#xff0c;时间复杂度为 O(nlog(n))&#xff0c;并且空间复杂度尽可能小。 示例 1&#xff1a; 输入&#xff1a; nums [5,2,3,1] 输出&am…...

僵尸进程是什么?

僵尸进程&#xff08;Zombie Process&#xff09;是指在 Unix/Linux 系统中&#xff0c;一个子进程已经终止&#xff0c;但其父进程尚未对它进行善后处理&#xff08;即没有读取其退出状态&#xff09;&#xff0c;导致子进程的进程表项仍然保留在系统中。由于这个进程已经结束…...

城市群出行需求的时空分形

城市群出行需求的时空分形 原文&#xff1a;He, Zhengbing. “Spatial-temporal fractal of urban agglomeration travel demand.” Physica A: Statistical Mechanics and its Applications 549 (2020): 124503. 1. Introduction&#xff08;引言&#xff09; 城市区域的重…...

LangChain入门(二)安装开发环境

1.安装conda Conda 是一个开源的软件包管理系统和环境管理系统&#xff0c;用于安装多个版本的软件包及其依赖关系&#xff0c;并在它们之间轻松切换。 Anaconda是一个开源的Python发行版本&#xff0c;其包含了conda、python等软件包&#xff0c;numpy、pandas、scipy等科学…...

如何开展有组织的AI素养教育?

一、AI素养的定义与核心内涵 AI素养是智能时代个体适应与创新能力的综合体现&#xff0c;其内涵随着技术发展动态扩展&#xff0c;包含以下核心维度&#xff1a; 知识体系&#xff1a;理解AI基本原理&#xff08;如算法、数据、算力&#xff09;、技术边界及发展趋势&#xff…...

InnoDB对LRU算法的优化

标准 LRU 算法的核心思想是&#xff1a;当缓存空间不足时&#xff0c;淘汰掉最近最少使用的数据块&#xff08;Page&#xff09;。它通常用一个链表来实现&#xff0c;链表头部是最近访问的 Page&#xff0c;链表尾部是最久未访问的 Page。 然而&#xff0c;在数据库系统中直接…...

云原生--核心组件-容器篇-7-Docker私有镜像仓库--Harbor

1、Harbor的定义与核心作用 定义&#xff1a; Harbor是由VMware开源的企业级容器镜像仓库系统&#xff0c;后捐赠给 CNCF (Cloud Native Computing Foundation)。它基于Docker Registry扩展了企业级功能&#xff0c;用于存储、分发和管理容器镜像&#xff08;如Docker、OCI标准…...

TypeScript 实用类型深度解析:Partial、Pick、Record 的妙用

需求背景&#xff1a;在后台系统的用户管理模块中&#xff0c;我们常遇到这样的场景&#xff1a;修改用户资料时只需要传部分字段&#xff0c;展示用户列表时要隐藏敏感信息&#xff0c;快速查找用户需要ID索引等等&#xff0c;这些业务需求都可以通过 TypeScript 的实用类型优…...

【Pandas】pandas DataFrame rmod

Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象&#xff08;如 DataFrame、Series 或标量&#xff09;的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...

如何搭建spark yarn 模式的集群集群

以下是搭建Spark YARN模式集群的一般步骤&#xff1a; 准备工作 - 确保集群中各节点安装了Java环境&#xff0c;并配置好 JAVA_HOME 环境变量。 - 各节点间能通过SSH免密登录。 - 安装并配置好Hadoop集群&#xff0c;YARN作为Hadoop的资源管理器&#xff0c;Spark YARN模式需要…...

云原生--核心组件-容器篇-6-Docker核心之-镜像仓库(公共仓库,私有仓库,第三方仓库)

1、Docker仓库的定义与核心作用 定义&#xff1a; Docker仓库&#xff08;Docker Registry&#xff09;是用于存储、分发和管理Docker镜像的集中式存储库。它类似于代码仓库&#xff0c;但专门用于容器镜像的版本控制和共享。它允许开发人员和IT团队高效地管理、部署和分享容器…...

mysql8.0版本部署+日志清理+rsync备份策略

mysql安装&#xff1a;https://blog.csdn.net/qq_39399966/article/details/120205461 系统&#xff1a;centos7.9 数据库版本&#xff1a;mysql8.0.28 1.卸载旧的mysql,保证环境纯净 rpm -qa | grep mariadb mariadb-5.... rpm -e --nodeps 软件 rpm -e --nodeps mariadb-5.…...

搭建spark yarn 模式的集群集群

一.引言 在大数据处理领域&#xff0c;Apache Spark 是一个强大的分布式计算框架&#xff0c;而 YARN&#xff08;Yet Another Resource Negotiator&#xff09;是 Hadoop 的资源管理系统。将 Spark 运行在 YARN 模式下&#xff0c;可以充分利用 YARN 强大的资源管理和调度能力…...

在uni-app中使用Painter生成小程序海报

在uni-app中使用Painter生成小程序海报 安装Painter 从GitHub下载Painter组件&#xff1a;https://github.com/Kujiale-Mobile/Painter 将painter文件夹复制到uni-app项目的components目录下 配置页面 在需要使用海报的页面的pages.json中配置 {"path": "pag…...

Uni-app网络请求AES加密解密实现

Uni-app 网络请求封装与 AES 加密解密实现 下面我将为你提供一个完整的 Uni-app 网络请求封装方案&#xff0c;包含 POST 请求的统一处理、请求参数和响应数据的 AES 加密解密。 1. 创建加密解密工具类 首先创建一个 crypto.js 文件用于处理 AES 加密解密&#xff1a; // u…...

uniapp实现统一添加后端请求Header方法

uniapp把请求写完了&#xff0c;发现需要给接口请求添加头部&#xff0c;每个接口去添加又很麻烦&#xff0c;uniapp可以统一添加&#xff0c;并且还能给某些接口设置不添加头部。 一般用于添加token登录验证信息。 在 main.js 文件中配置。 代码如下&#xff1a; // 在…...

uniapp打包apk如何实现版本更新

我们做的比较简单&#xff0c;在后端设置版本号&#xff0c;并在uniapp的config.js中定义版本号&#xff0c;每次跟后端的进行对比&#xff0c;不一致的话就更新。 一、下载apk 主要代码&#xff08;下载安装包&#xff0c;并进行安装&#xff0c;一般得手动同意安装&#xf…...

【Java开发日记】OpenFeign 的 9 个坑

目录 坑一&#xff1a;用对Http Client 1.1 feign中http client 1.2 ribbon中的Http Client 坑二&#xff1a;全局超时时间 坑三&#xff1a;单服务设置超时时间 坑四&#xff1a;熔断超时时间 4.1 使用feign超时 4.2 使用ribbon超时 4.3 使用自定义Options 坑五&…...

RocketMQ 存储核心:深入解析 CommitLog 设计原理

一、引言 在分布式消息队列系统中&#xff0c;消息存储的可靠性和高吞吐能力是衡量系统优劣的核心指标。Apache RocketMQ 作为一款高性能、高可用的分布式消息中间件&#xff0c;其独特的 CommitLog 存储机制在消息持久化过程中扮演了关键角色。本文将深入剖析 CommitLog 的设…...

【C++ Qt】快速上手 显⽰类控件(Label、LCDNumber、ProcessBar、CalendarWidget)

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本文围绕Qt中常用的显示类控件展开&#xff0c;重点讲解了 QLabel&#xff08;文本/图片显示&#xff09;、QLCDNumber&#xff08;数字显示&#xff0…...

Docker和K8s面试题

1.Docker底层依托于linux怎么实现资源隔离的&#xff1f; 基于Namespace的视图隔离&#xff1a;Docker利用Linux命名空间&#xff08;Namespace&#xff09;来实现不同容器之间的隔离。每个容器都运行在自己的一组命名空间中、包括PID&#xff08;进程&#xff09;、网络、挂载…...

shell--数组、正则表达式RE

1.数组 1.1定义 什么是数组? 数组也是一种变量,常规变量只能保存一个值,数组可以保存多个值 1.2 分类 普通数组:只能用整数作为数组的索引--0 下标 有序数组(普通数组):(index)索引(为整数,从0开始) 关联数组:可以使用字符串作为数组的索引 1.3 普通数组 引用: ec…...

java 使用 POI 为 word 文档自动生成书签

poi 版本&#xff1a;4.1.0 <properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><…...

redis+lua+固定窗口实现分布式限流

用key的过期时间替代固定窗口的时间戳 -- KEYS[1]: 限流的key -- ARGV[1]: 限流窗口大小&#xff08;秒&#xff09; -- ARGV[2]: 限流阈值local key KEYS[1] local window tonumber(ARGV[1]) local limit tonumber(ARGV[2])-- 尝试获取当前计数 local current redis.call…...

什么是SQL92标准,有什么特点和影响?

一、SQL92简介 SQL92标准是1992年由美国国家标准协会&#xff08;ANSI&#xff09;和国际标准化组织&#xff08;ISO&#xff09;联合制定的数据库语言标准&#xff0c;正式名称为"SQL&#xff1a;1992"或ISO/IEC 9075:1992。他是关系型数据库管理系统&#xff08;R…...

Flink Checkpoint 与实时任务高可用保障机制实战

在实时数仓体系中,数据一致性和任务稳定性是核心保障。本文围绕 Flink Checkpoint 机制,深入讲解高可用保障的最佳实践和工程实现。 一、业务背景与痛点 在金融风控、营销实时推荐、智能监控等场景中,实时数仓的每一条数据都至关重要。常见的业务痛点包括: 断点恢复困难:…...

WebRtc08:WebRtc信令服务器实现

如何使用socket.io发送消息 发送消息 // 给本次连接发送消息 socket.emit()// 给某个房间内所有人发送消息 io.in(room).emit()// 除了自己以外&#xff0c;给某个房间的所有人发消息 socket.to(room).emit();// 除本连接外&#xff0c;给所有人发消息 socket.broadcast.emit…...

基于 SpringBoot 与 Redis 的缓存预热案例

文章目录 “缓存预热” 是什么&#xff1f;项目环境搭建创建数据访问层预热数据到 Redis 中创建缓存服务类测试缓存预热 “缓存预热” 是什么&#xff1f; 缓存预热是一种优化策略&#xff0c;在系统启动或者流量高峰来临之前&#xff0c;将一些经常访问的数据提前加载到缓存中…...

Python对比两张CAD图并标记差异的解决方案

以下是使用Python对比两张CAD图并标记差异的解决方案&#xff0c;结合图像处理和CAD结构分析&#xff1a; 一、环境准备与库选择 图像处理库&#xff1a;使用OpenCV进行图像差异检测、颜色空间转换和轮廓分析。CAD解析库&#xff1a;若为DXF格式&#xff0c;使用ezdxf解析实体…...

LINUX427 冒险位 粘滞位 chmod 权限

为什么不同用户能查看的文件夹不同 思索 是因为不同文件夹的权限不同吗&#xff1f;感觉不是 权限不就是只有rwx权限吗&#xff1f; o 对对对 和0GU有关 O 组内的其他用户应该 O是其他用户 不是组内用户 文件创建应该设置了r权限 但是root为什么看到的好像不一样 root 这些…...

10 DPSK原始对话记录

10 DPSK原始对话记录 前言 编程之余,在 Vscode 的 Cline 插件界面中和 ai (dpsk v3-0324) 聊起了天,得到了一个有意思的回答。就像ai有自我意识一样。在此记录。 实际对话内容 时间范围:2025-04-27 23:37:22 - 23:44:17 对话模式:PLAN MODE [23:37:22] 用户提问 “你…...

实现一个瀑布流布局

1、纯CSS实现 实现方式&#xff1a;借助column-count属性来创建 4 列的布局&#xff0c;并使用 column-gap 设置列间距。每个 .img-container 使用 break-inside: avoid 来防止图片被分割。 来看一下完整的代码&#xff1a; <!DOCTYPE html> <html lang"en&qu…...