news 2026/10/6 12:59:13

华为OD备考指南:机试真题与Java技术面高频考点解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD备考指南:机试真题与Java技术面高频考点解析

前阵子有个准备跳槽的同事问我:"华为OD的技术面到底考什么?我看网上全是经验帖,越看越慌。"我干脆把Java开发方向最近被反复问到的几类题整理了一遍,从机试到技术面、从手撕代码到基础八股,顺带把我自己踩过的坑也写进去。这篇先出第一期,围绕华为OD机试和Java技术面最核心的考点展开,目标是让准备OD机考和Java面试的人都能拿去做对标复习——你不需要把面经全背下来,但至少要清楚每一类题背后的考察逻辑,以及怎么在有限时间内把分拿稳。

1. 华为OD面试到底在考察什么:流程拆解与备考思路

华为OD的招聘流程和大厂社招不太一样,它更看重"标准化筛选"和"项目匹配度"。很多第一次接触OD的人一上来就刷题,刷到一半才发现真正卡人的不是难度,而是对流程和信息的不熟悉。我这里先把完整流程和各环节的考察重点说清楚。

1.1 完整面试流程与各环节的"送分/送命"属性

一般来说,华为OD的流程是这样走的:投递简历 → 机试(上机考试)→ 性格测评 → 技术一面 / 技术二面 → 主管面 → HR面 / 综合面,之后走审批和定级。不同部门、不同地区会有细微差别,但大体就是这个结构。

  • 简历筛选:这一环主要看你的技术栈和工作年限,Java开发方向的核心是项目经历和框架使用情况,有Spring Boot、微服务、高并发相关的项目经验会明显加分。
  • 机试:这是第一道硬门槛,也是最容易"莫名其妙被刷"的环节。很多人算法基础还行,但因为没有提前熟悉在线评测平台的操作和出题风格,导致时间分配失误,第一题都没AC。
  • 性格测评:别不当回事,超过一半的人是在这里被系统标记的。它不是考试,但会通过大量重复题目判断你的抗压性、团队协作倾向和风险偏好。如果你前面的题答得太"完美",后面突然出现矛盾选项,很容易被判为不真实。
  • 技术面:一般一到两轮,以手撕代码 + Java基础八股 + 项目深挖为主。项目深挖往往会追到你不熟悉的细节,比如你项目里用了Redis,面试官会追问缓存穿透、缓存击穿、缓存雪崩,以及你当时的存储结构设计。
  • 主管面 / 综合面:重点考察沟通能力、学习能力、对加班和驻场开发的态度。这一轮技术比重下降,但会考察你对华为文化的理解和岗位预期。

这里要提醒一下:OD的机试成绩会直接关联到你的定级,不是说"过了就行"。分数越高,后续技术面可能给你匹配的项目也越好,甚至影响起薪区间。所以备考的重点不是"能不能过线",而是"尽量拿高分"。

1.2 机试命题逻辑与评分规则:先搞清楚游戏规则再动手

华为OD机试一般是在线评测系统上完成的,限时150分钟左右,共三道题,分值通常是100分、200分、300分,总分600分,通过线一般在150分左右,但具体以当次通知为准。这里最核心的信号就是:你不需要三道题全对才能过线,但第一题和第二题基本是能不能过线、能不能拿高分的关键。

第一题典型是模拟题或字符串题,考察基本功;第二题开始上难度,常见的有动态规划、DFS/BFS、双指针之类的中间难度题;第三题则是综合题,经常涉及复杂模拟、图论或多种数据结构的组合使用,考察的是代码组织能力和边界处理能力。

建议大家做题顺序严格按 1 → 2 → 3 来,第一题必须稳稳AC,第二题至少拿到80%的分数,第三题即便做不出来,也要把暴力的部分分写上。很多人在第三题上死磕了一个多小时,回头发现第二题简单思路被自己忽略了,这才是最可惜的。

机试一般支持C++、Java、Python,我强烈建议Java方向的同学直接选Java,因为你后续技术面也是Java,熟练度更高。但要注意,在线评测的Java运行效率确实不如C++,遇到大数据量题目时,尽量用StringBuilder代替String拼接,能用数组就不要硬套Map,这些细节会在判分时体现出来。

还有一点容易忽略:机试的输入输出格式非常严格,经常有"多组输入""字符串中含空格""整数范围超int"这类坑。平时的练习里,至少要有10%的时间单独训练输入输出解析,别让代码逻辑写对了却因为读取格式不对而丢掉AC。

2. 上机考试真题解析:三道题的分层破题思路

这里我不写具体标准答案式的"背题",而是把机试里最常出现的三类题型各拆一道,讲清楚破题点和实现思路。下面两组题目会反复在OD机试中出现类似的变体。

2.1 第一题:字符串处理类真题,怎么稳稳拿满分

先说一道出现频率极高的第一题类型:给定一个字符串,要求去除重复字符并按字典序输出。类似变体包括统计字符出现次数、反转字符串、判断回文、字符串转数字等。这类题核心考点是:字符处理是否熟练、是否了解Java字符串操作的性能特征。

典型的思路是用一个HashSet去重,然后收集到List里排序;但机试为了效率也可以直接用int[26]或int[128]的数组做字符计数,边扫描边标记,最后按字符顺序输出。直接看代码:

public static String removeDuplicateAndSort(String input) { if (input == null || input.length() == 0) { return ""; } boolean[] visited = new boolean[128]; for (char c : input.toCharArray()) { visited[c] = true; } StringBuilder sb = new StringBuilder(); for (char c = 'a'; c <= 'z'; c++) { if (visited[c]) { sb.append(c); } } return sb.toString(); }

这个写法有几个好处:第一,用boolean数组代替Set,省去装箱拆箱的开销;第二,输入的范围如果限定在小写字母,直接遍历'a'到'z',天然有序;第三,StringBuilder避免频繁字符串拼接。如果题目要求保留原顺序而不是字典序,就改成LinkedHashSet或者直接用boolean数组加一次追加遍历,思路是一样的。

做题时我习惯先写一个朴素版本,保证正确性,再考虑优化。第一题只要逻辑清晰、边界条件处理好(空字符串、null、大小写混合),基本都能AC。

2.2 第二题:动态规划/搜索类真题,套路化拆解

第二题最常见的是动态规划。这里拿"爬楼梯"的升级版举例——一个人爬楼梯,每次可以走1级或2级台阶,问走到第n级有几种走法。这是最原始版本,OD机试里更多变体会变成"每次可以走1级、2级或3级"或者"某些台阶不能停留",考察的还是状态转移的思想。

核心DP代码:

public static int climbStairs(int n) { if (n <= 2) { return n; } int[] dp = new int[n + 1]; dp[1] = 1; dp[2] = 2; for (int i = 3; i <= n; i++) { dp[i] = dp[i - 1] + dp[i - 2]; } return dp[n]; }

有些同学会问,这不就是斐波那契吗?对,本质就是斐波那契,但重点在于你要能灵活迁移。比如题目改成"一次可以走1~k级",你就会发现dp[i] = dp[i-1] + dp[i-2] + ... + dp[i-k];再比如加了限制"第m级台阶不能踩",那初始化时dp[m] = 0即可。这种由浅入深的思考方式,才是面试官想看到的。

如果遇到的是DFS/BFS类问题,比如"岛屿数量""矩阵路径"或者"迷宫最短步数",核心套路就是四方向遍历、visited数组标记、递归边界判断。这类题在机试中占的比重大,建议提前把DFS的模板写到条件反射的程度,不要现场想。

2.3 第三题:综合模拟题,不求全对但求有分

第三题经常是"复杂业务模拟",例如:多个任务按优先级和到达时间调度,输出每个任务的完成时间;或者一个矩阵地图上有多个道具,要求规划路径收集道具后到达终点。这类题信息量很大,读题本身可能就要花十分钟。

我的策略是:先花5分钟把题目需求用伪代码写下来,理清实体和操作;再看数据范围决定解法。如果没思路,直接写暴力版本,哪怕超时,也能拿到部分分——OD机试是按测试用例给分的,暴力过几个小数据用例,比你交白卷强得多。

举个例子:如果第三题是"给定一串进程的到达时间和执行时长,模拟非抢占式调度,输出平均等待时间",你完全可以先用优先队列维护"当前已到达进程的执行时间",每次取执行时间最短的进程执行。这种用PriorityQueue模拟的方式代码短,思路清晰,即使不是最优解也能覆盖绝大多数用例。

PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> a[1] - b[1]); // 按执行时间

2.4 机试刷题策略:如何在有限时间拿到最高分

机试备考不是刷得越多越好,而是按题型分类击破。按我的经验,合理的刷题分配是:40%的时间刷字符串/模拟题,35%刷动态规划和搜索,25%刷贪心、双指针、栈队列和常见数据结构题。刷题平台优先选牛客网的华为OD真题库和LeetCode热题100,因为OD机试的题目风格和LeetCode不完全一致,牛客的题型更贴近实际的在线评测环境。

每天保持两道题的量,一道简单巩固基础,一道中等难度锻炼思维,周末做一次完整的模拟机试(150分钟三道题)。这样坚持三周,通过机试基本没问题。在模拟时尤其要练"写代码的速度",因为第一题往往不难,但如果你在输入输出解析上浪费了20分钟,后面第二题的思考时间就被压缩了。

3. 技术面手撕代码与Java八股:高频考点实录

通过机试后,技术面才是真正拉开差距的地方。技术面一般分成三个环节:自我介绍、手撕代码、基础八股和项目问答。Java方向的考题通常不会太偏,但会在"基础概念"上往深处挖,比如问HashMap的原理时,很多同学只背了"数组+链表"就答完了,但面试官后面还会追问红黑树的引入条件、扩容时的rehash、JDK 8为什么用尾插法。

3.1 手撕代码环节:排序与链表是重灾区

技术面的手撕代码题量不大,通常一到两道,但要求"边写边说思路"。高频题目是手写快速排序、链表反转、合并两个有序链表、判断链表是否有环。我建议把所有基础排序都练到闭眼能写,因为面试官很可能会在你写完快排后追问"时间复杂度怎么来的""最坏情况是什么"。

手写一个链表反转:

public ListNode reverseList(ListNode head) { ListNode prev = null; ListNode curr = head; while (curr != null) { ListNode nextTemp = curr.next; curr.next = prev; prev = curr; curr = nextTemp; } return prev; }

这类题不考智商,考熟练度和代码手感。写的时候要注意边界的引用传递,别把链表写断开,同时嘴里要同步说出"当前节点指向pre,然后移动指针"这样的过程。面试官很在意你能不能把思路讲清楚,而不仅仅是默默写完。

3.2 Java容器源码考点:从HashMap到ConcurrentHashMap

Java容器是OD技术面的必考区,尤其HashMap。一个完整的HashMap答案应该包含五层递进:

  • 底层结构:JDK 8 是数组+链表+红黑树,数组的每个位置叫桶。
  • put流程:计算hash(key.hashCode()高低位异或)、找桶下标、判断是否为空、遍历链表找相同key、判断是否需要树化(链表长度≥8且数组长度≥64)、插入后判断容量是否超阈值触发扩容。
  • 扩容机制:默认初始容量16,负载因子0.75,扩容为原来的2倍,元素重新散列。
  • 为什么用红黑树:链表过长时查询退化为O(n),红黑树把查询降到O(logn)。
  • 线程安全问题:HashMap不是线程安全的,多线程put可能导致死循环(JDK7头插法)或数据丢失。

在此基础上,面试官大概率会追问ConcurrentHashMap。JDK 8的ConcurrentHashMap用了CAS + synchronized,锁粒度细到单个桶;读操作不加锁,依赖volatile保证可见性。回答的时候可以把"分段锁"和"CAS+synchronized"做个对比,说明JDK 8为什么放弃分段锁。

这里有个经验之谈:答容器题时,不要一上来就背源码。先说"我从底层结构、插入流程、扩容、线程安全四个角度回答",然后按顺序展开。面试官会默认你有清晰的逻辑,哪怕有小细节记错了,整体印象也不会差。

3.3 JVM与并发考点:从内存模型到锁升级

JVM和并发在OD技术面里的比重不如容器,但几乎每次都会被点到。JVM的常问题是:"Java内存区域有哪些""什么是类加载的双亲委派机制""GC如何判断对象可回收""你项目里有没有调过JVM参数"。

关于内存区域,要把线程私有和线程共享分清楚:线程私有的是程序计数器、虚拟机栈、本地方法栈;线程共享的是堆和方法区(JDK 8改成元空间)。类加载的双亲委派,简单的理解就是"先让爸爸加载,加载不了自己才上",好处是避免核心类被重复加载。

并发方面最常问的是:synchronized和ReentrantLock的区别、volatile的作用、线程池的参数和执行流程、锁升级过程。锁升级这个考点很典型:无锁 → 偏向锁 → 轻量级锁 → 重量级锁。很多人搞混的是"偏向锁是不是一定比轻量级锁好?"实际上偏向锁适合"只有一个线程访问同步块"的场景,一旦出现竞争就升级。

我建议准备一个"自己项目里的并发场景",比如订单号生成、库存扣减,用来回答"你项目中怎么处理并发"这类问题。单纯背AQS、CAS的理论定义,远不如一个真实场景让人信服。

3.4 数据库与Spring考点:看似基础实则深挖

Java开发方向的技术面一定绕不开MySQL和Spring。MySQL最常考的包括:索引为什么用B+树、聚簇索引和非聚簇索引的区别、事务的ACID、事务隔离级别、MVCC原理、一条SQL执行很慢怎么排查。

这里要特别说一下B+树:面试官往往期待你先回答"和B树的区别",而不是直接说"B+树快"。正确的对比思路是:B+树数据只在叶子节点,非叶子节点只存索引,所以树更矮、IO更少;叶子节点有链表指针,适合范围查询和排序;B树的每个节点都存数据,树相对更胖,范围查询需要回溯。

Spring常问的是IOC和AOP原理、Bean的生命周期、循环依赖怎么解决、事务失效的场景。其中"事务失效"是近年来的热点,常见场景有:方法非public、类内部调用(this调用)、异常被catch了、数据库引擎不支持事务。回答这类题,如果能结合一次真实的Bug经历,含金量远超背诵。

4. 容易被问翻车的Java基础细节题:那些面试官喜欢挖的坑

有时候技术面难倒人的反而不是高深的并发和JVM,而是最基础的Java细节。这类题看起来简单,但越简单越能暴露一个开发者的功底。我总结几个被反复问到的"坑"题。

4.1 值传递与引用传递:一句话就能暴露基础

这是Java面试最经典的"送命题"之一。很多人一上来就说"基本类型是值传递,对象是引用传递",这句话并不完全对。Java只有值传递,只是对象传递的是引用地址的值。

看这段代码:

public static void change(String str) { str = "world"; } public static void main(String[] args) { String str = "hello"; change(str); System.out.println(str); // 输出 hello }

这里String表面上被"修改"了,实际上没变,因为方法参数复制的是引用,而重新赋值str = "world"只是让方法内的引用指向了新的常量池对象,外部的引用不受影响。如果是修改对象的字段,比如Person对象里setName,因为两个引用指向同一个对象,外部就能看到变化。

回答这道题的核心就一句话:Java只有值传递,引用类型的值也是值(地址值)。如果能举出String和Person对象的对比例子,整道题就答得很圆满了。

4.2 字符串与"==":一道题引出JVM常量池

再来看一道几乎必考的题:"String s1 = ""hello""; 和 String s2 = new String(""hello""); 用==比较结果是什么?"很多人知道答案是false,但说不清为什么。

原因在于:字面量字符串会被放入JVM的字符串常量池,s1直接指向常量池对象;new String会强制在堆里创建新对象,s2指向堆对象。两个引用指向不同对象,所以==结果是false。但s1.equals(s2)是true,因为equals比较的是内容。

接下来面试官还会追加:如果把代码改成String s3 = s1.intern();然后比较s3 == s1,答案是true,因为intern()会把字符串对象提交到常量池,如果常量池已有相同内容的字符串,就返回该常量池对象的引用。如果能顺着这个思路讲到"字符串常量池在JDK 7之后被移到了堆里",面试官基本上就满意了。

我面试时还遇到过一种变体:String s4 = "he" + "llo";与s1 == s4比较,结果也是true,因为编译期常量折叠。换成String suffix = "llo"; String s5 = "he" + suffix;那么s5 == s1是false,因为suffix是变量,拼接发生在运行期。这种题不难,但确实能区分"背过八股"和"真懂原理"的人。

4.3 面向对象设计:重载、重写与抽象类和接口的边界

Java面向对象的基础题总喜欢从重载和重写切入。重载是同一个类中方法名相同、参数列表不同,编译期决定调用哪个;重写是子类重新实现父类方法,方法签名必须一致,运行期决定调用哪个。一个记巧:重载看编译,重写看运行。

再往上延伸,就是"抽象类和接口怎么选"。老生常谈但容易答偏。核心不是背区别表,而是说清楚设计语义:抽象类是"is-a"关系,强调共性;接口是"can-do"关系,强调能力。Java 8之后接口可以有default方法,所以两者在功能上越来越接近,但单继承和多实现仍然是最本质的区别。

我在面试中还遇到过这样的设计题:"如果要设计一个支付模块,有微信、支付宝、银行卡,你会用抽象类还是接口?"较好的回答是:先定义一个Payment接口,包含pay和refund方法;再抽一个抽象类AbstractPayment,公共方法如生成订单、记录日志写在里面;不同支付方式继承抽象类并实现各自逻辑。这样既统一了入口,又复用了公共代码。

4.4 Java 8新特性:Lambda、Stream 与函数式接口

Java 8新特性在OD技术面里有时作为加分项,有时作为"你项目里有没有用过这些"来问。最常见的考点是Stream的中间操作和终端操作,以及Optional的用法。

一个典型的例子:从员工列表中筛选出工资大于8000的员工,按工资降序排序,只取前三个名字。

List<String> result = employees.stream() .filter(e -> e.getSalary() > 8000) .sorted(Comparator.comparing(Employee::getSalary).reversed()) .limit(3) .map(Employee::getName) .collect(Collectors.toList());

这个代码几乎可以应对所有"Stream怎么用"的问题。面试官如果追问"filter和sorted哪个先执行高效",要注意:sorted之前先filter可以减少排序元素的数量,所以filter先执行更优。还有一点,collect(Collectors.toList())是终端操作,流是惰性的,没有终端操作不会真正执行。

很多人容易忽略的是Optional的语义。使用Optional的重点是"用map、orElse、orElseGet这类方法,而不是直接调用get()",否则就失去了防NPE的意义。如果你能在项目里举一个"用Optional重构空指针判断"的例子,这道题就非常加分。

5. 备考与面试过程中的实战经验:时间规划、心态调整与复盘方法

技术能力之外,备考节奏和临场心态同样影响结果。我见过算法底子不错但因为疏于模拟而超时的人,也见过项目经历很普通但准备充分、表达清晰从而拿到好评的人。这里分享几个实操性强的建议。

5.1 机试备考的周期与刷题节奏

如果平时工作比较忙,我建议按四周规划,太长容易拖沓,太短不足以形成肌肉记忆。

周期重点每日任务
第一周字符串、数组、模拟题每天2~3道简单题,强化输入输出处理
第二周动态规划、DFS/BFS、双指针每天2道中等难度题,按题型分类刷
第三周栈/队列/哈希/贪心每天1道中等+1道困难,重点看题解思路
第四周全真模拟每两天一次整套机试模拟,严格限时

第四周的全真模拟很关键。做模拟时,我会刻意给自己加压:如果一道题20分钟还没有完整思路,果断跳过,先做后面的题,最后再回头补。机试的150分钟过起来很快,前面时间分配不好,后面连读题时间都不够。

5.2 面试中遇到不会的题怎么办

技术面最忌讳的不是"不会"而是"沉默"。遇到不会的题目,最好的处理方式是:先说"这道题我首先想到的思路是XX,但因为XX原因可能不是最优",然后边说边写,把部分思路展示出来。哪怕是暴力解法,面试官也能看到你的思考路径。

举个例子,如果面试官让手写一个"最长回文子串",你一时想不起动态规划的状态转移方程,没关系,直接说"我先用中心扩展法试试,遍历每个字符作为回文中心,向两边扩展",这就是正确答案的常见替代方案。即便你没完全写对,但思路清晰、边界处理得当,也远比"我不会"要好。

遇到八股题答不上来时,别急着放弃,可以用"我项目中遇到的场景是……"做一个过渡。比如面试官问"AQS的实现原理",你如果只记得CLH队列和state变量,可以先从"我在项目中用过ReentrantLock,它的底层就是AQS"切入,至少把话题引到自己熟悉的角落。

5.3 考后复盘:把每场面试变成自己的知识库

我习惯每场面试结束后立刻做一次复盘,时间不超过半小时,但收获很大。复盘模板大概是这样:

  • 面试官问了哪些题?哪些答得流畅,哪些卡壳了?
  • 卡壳的原因是知识点缺失,还是紧张导致表达混乱?
  • 把不会的题按"基础语法 / 容器 / JVM / 并发 / 数据库 / Spring / 算法"分类记录。
  • 三天后把这些题重新做一遍,确认真的记住了,而不是看一遍就过。

这个方法看起来很朴素,但坚持下来,你会发现自己对Java知识体系的掌握会越来越系统。尤其是机试里的错题,一定要重新手写一遍,因为很多题"看答案会了"和"自己AC"之间差着十万八千里。


最后再分享一点我个人的体会:华为OD面试的整个周期可能拖得比较长,从投递到拿offer有时候要一个月以上,中间不要因为一轮表现不好就自我怀疑,也不要因为拿到了口头offer就彻底放松。把每一次面试都当成一次项目检测,哪里薄弱补哪里,这个过程本身就很值钱。下一期我打算整理一下OD技术面里的项目深挖真题,尤其是Spring Boot和微服务相关的追问套路,到时候见。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 12:58:25

HTTP从入门到排查:报文、抓包、报错与HTTPS实战

HTTP大概是所有写代码的人每天都要碰&#xff0c;却最容易被当成"常识"忽略的东西。浏览器里按一下F12能看到一堆Request Headers、Status Code&#xff0c;但你多半不会去细想它们代表什么。真正到了线上环境&#xff0c;错误提示变成 "error response from da…

作者头像 李华
网站建设 2026/10/6 12:58:14

C++栈与队列从原理到工程:手写实现、STL容器与算法实战

队列、栈这两个名字&#xff0c;在C数据结构与算法的学习路径里几乎永远是先出场的主角。随手翻开一本《数据结构》教材&#xff0c;前半部分是顺序表、链表&#xff0c;到了队列和栈这里&#xff0c;很多人会觉得“不就是两个线性结构嘛&#xff0c;一个先进后出&#xff0c;一…

作者头像 李华
网站建设 2026/10/6 12:56:19

毕设面试系统实战指南:从解压到上线的全流程拆解

简介&#xff1a;本资源是一套面向计算机专业本科生的毕业设计级面试系统实现方案&#xff0c;聚焦招聘流程数字化改造&#xff0c;适用于课程设计、毕设选题与HR系统开发实践。项目完整覆盖需求分析、前后端开发、数据库设计及部署说明&#xff0c;解决简历筛选低效、面试安排…

作者头像 李华
网站建设 2026/10/6 12:56:11

K8s中Hadoop Datanode故障排查:探针失败与磁盘满根因

周四下午&#xff0c;我正在盯着k8s集群的监控面板&#xff0c;突然收到Hadoop集群一条告警&#xff1a;某个datanode掉线了。这已经不是第一次处理这种问题&#xff0c;但每次的诱因都不完全一样。最开始我接到这类故障的第一反应是直接重启pod&#xff0c;但后来发现——重启…

作者头像 李华
网站建设 2026/10/6 12:55:07

新电脑装系统避坑全指南:分区、引导、驱动与虚拟机实战

新电脑到手&#xff0c;第一件事通常是装系统。这事儿说难不难&#xff0c;说简单也真不简单——我见过太多人栽在各种莫名其妙的地方&#xff1a;启动盘做好了却进不去&#xff0c;装完Windows 发现Linux引导没了&#xff0c;新买的N卡装完驱动直接黑屏&#xff0c;还有人在虚…

作者头像 李华
网站建设 2026/10/6 12:54:24

Tensor.flatten(start_dim)深度解析:PyTorch张量展平与维度控制实战

Tensor.flatten(start_dim) 是我在 PyTorch 里用得最勤的接口之一&#xff0c;尤其是搭 CNN、做多头注意力、处理各种多维特征图的时候&#xff0c;几乎每一版模型代码里都会出现它。别看它只是一行 .flatten() &#xff0c;真正能把 start_dim 用明白、用对&#xff0c;不…

作者头像 李华