C++ 面试题
1. 基础语法与语言特性 C++ 中指针、引用、数组的区别与使用场景? 指针:可为空,可随时指向其他对象,使用 * 解引用,需手动管理生命周期。 引用:必须绑定对象,不能更换绑定对象,使用方式与普通变量一致,更安全。 数组:本质为连续内存,数组名可衍生为指向首元素的指针。 解释 virtual、override、final、const 的作用与用法。 什么是 RAII?它如何帮助资源管理? 简述 std::move 和 std::forward 的区别及使用场景。 2. 性能与内存优化2.1 游戏中出现卡顿的定位与优化 主线程阻塞(I/O、资源加载)。 GC/内存碎片化。 大量对象更新。 不合理的 Tick 顺序。 2.2 如何实现一个内存池?适合用在哪些场景?目的:减少频繁 new/delete 的开销与碎片。 维护一个连续的大内存数组。 使用空闲链表连接空闲块。 分配时从链表取块,释放时归还链表。 2.3 其他问题 请实现一个简单的对象池(Object Pool)模板类。 请说说 cache-friendly 编码风格的一些例子。
UE4渲染流程
非常好的系统了解UE渲染管线的视频讲解虚幻引擎中文技术直播 第1期 虚幻引擎4的实时渲染流程_哔哩哔哩_bilibili
UE5 Gameplay Camera
为什么使用 Gameplay Camera 模块化的设计。 能更简便地创建复杂的摄像机行为。 能创建自定义的过渡行为。
K-Avoiding 数组的最小总和
给你两个整数 n 和 k 。 对于一个由 不同 正整数组成的数组,如果其中不存在任何求和等于 k 的不同元素对,则称其为 k-avoiding 数组。 返回长度为 n 的 k-avoiding 数组的可能的最小总和。 示例 1: 输入:n = 5, k = 4输出:18解释:设若 k-avoiding 数组为 [1,2,4,5,6] ,其元素总和为 18 。可以证明不存在总和小于 18 的 k-avoiding 数组。示例 2: 输入:n = 2, k = 6输出:3解释:可以构造数组 [1,2] ,其元素总和为 3 。可以证明不存在总和小于 3 的 k-avoiding 数组。 提示: 1 <= n, k <= 50 解法一:暴力遍历从1开始构造正整数数组,判断新增元素是否满足条件。 1234567891011121314151617class Solution: def minimumSum(self, n: int, k: int) -> int: result = [] ...
LeetCode 624 - 数组列表中的最大距离
数组列表中的最大距离中等相关标签相关企业给定 m 个数组,每个数组都已经按照升序排好序了。 现在你需要从两个不同的数组中选择两个整数(每个数组选一个)并且计算它们的距离。两个整数 a 和 b 之间的距离定义为它们差的绝对值 |a-b| 。 返回最大距离。 示例 1: 输入:[[1,2,3],[4,5],[1,2,3]]输出:4解释:一种得到答案 4 的方法是从第一个数组或者第三个数组中选择 1,同时从第二个数组中选择 5 。示例 2: 输入:arrays = [[1],[1]]输出:0 提示: m == arrays.length2 <= m <= 1051 <= arrays[i].length <= 500-104 <= arrays[i][j] <= 104arrays[i] 以 升序 排序。所有数组中最多有 105 个整数。 思路0:遍历每个数组,获取最大和最小值。遍历完后相减。 错原因:题目中要求不同数组。思路1: 遍历每个数组 ...
LeetCode 1552 - 两球之间的磁力
题目给定一个数组 position 表示球的位置,以及整数 m 表示要放的球数。把 m 个球放入这些位置,使任意两球间的最小磁力(距离)最大。返回这个最大值。 解题思路 先对位置排序。 对“最小间距”进行二分搜索:假设最小间距为 d,检查能否放下 m 个球。 检查方式:从最左位置开始贪心放球,尽量保持相邻球间距 ≥ d,统计能放下的球数。 如果能放下 m 个球,说明 d 可行,尝试更大;否则缩小。 代码实现(Python)1234567891011121314151617181920212223242526from typing import Listclass Solution: def maxDistance(self, position: List[int], m: int) -> int: position.sort() def can_place(dist: int) -> bool: count = 1 last = position[0] for x...
LeetCode 2080 - 区间内查询数字频率
题目请你设计一个数据结构,它能求出给定子数组内一个给定值的频率。 子数组中一个值的频率指的是这个子数组中这个值的出现次数。 请你实现 RangeFreqQuery 类: RangeFreqQuery(int[] arr) 用下标从 0 开始的整数数组 arr 构造一个类的实例。 int query(int left, int right, int value) 返回子数组 arr[left...right] 中 value 的频率。 示例 1输入: 12["RangeFreqQuery", "query", "query"][[[12, 33, 4, 56, 22, 2, 34, 33, 22, 12, 34, 56]], [1, 2, 4], [0, 11, 33]] 输出: 1[null, 1, 2] 解释: 123RangeFreqQuery rangeFreqQuery = new RangeFreqQuery([12, 33, 4, 56, 22, 2, 34, 33, 22, 12, 34,...
LeetCode 1706 - 球会落在哪里
题目用一个大小为 m x n 的二维网格 grid 表示一个箱子。你有 n 颗球。箱子的顶部和底部都是开着的。 箱子中的每个单元格都有一个对角线挡板,跨过单元格的两个角,可以将球导向左侧或者右侧。 将球导向右侧的挡板跨过左上角和右下角,在网格中用 1 表示。将球导向左侧的挡板跨过右上角和左下角,在网格中用 -1 表示。在箱子每一列的顶端各放一颗球。每颗球都可能卡在箱子里或从底部掉出来。如果球恰好卡在两块挡板之间的 “V” 形图案,或者被一块挡导向到箱子的任意一侧边上,就会卡住。 返回一个大小为 n 的数组 answer ,其中 answer[i] 是球放在顶部的第 i 列后从底部掉出来的那一列对应的下标,如果球卡在盒子里,则返回 -1 。 思路 构造一个长度为球数的数组 result,记录每个球当前所在的列。 如果某个球无法进入下一行,则将对应位置设为 -1。 遍历每一行时,只更新 result 中不为 -1 的球。 代码实现12345678910111213141516171819202122232425262728class Solution: def...
LeetCode题目分类总结
动态规划类题目1. 基础型动态规划 LeetCode 746 使用最小花费爬楼梯 特点:线性DP,每步决策只依赖前两步 状态定义:dp[i]表示到达第i个台阶的最小花费 优化:可以用滚动数组将空间复杂度优化到O(1) LeetCode 119 杨辉三角形 II 特点:组合数学问题,可以用DP优化 技巧:利用滚动数组优化空间复杂度 2. 决策型动态规划 LeetCode 198 打家劫舍 特点:相邻元素不能同时选择 状态定义:dp[i]表示前i个房屋能偷到的最大金额 状态转移:dp[i] = max(dp[i-1], dp[i-2] + nums[i]) LeetCode 740 删除并获取点数 特点:决策会影响相邻元素,类似打家劫舍 优化:通过计数转化为打家劫舍问题 3. 多维动态规划 LeetCode 2944...
LeetCode 1742 - 盒子中小球的最大数量
题目你在一家生产小球的玩具厂工作,有 n 个小球,编号从 lowLimit 开始,到 highLimit 结束(包括 lowLimit 和 highLimit,即 n == highLimit - lowLimit + 1)。另有无限数量的盒子,编号从 1 到 infinity。 你的工作是将每个小球放入盒子中,其中盒子的编号应当等于小球编号上每位数字的和。例如,编号 321 的小球应当放入编号 3 + 2 + 1 = 6 的盒子,而编号 10 的小球应当放入编号 1 + 0 = 1 的盒子。 给你两个整数 lowLimit 和 highLimit,返回放有最多小球的盒子中的小球数量。如果有多个盒子都满足放有最多小球,只需返回其中任一盒子的小球数量。 解题思路方法一:哈希表统计12345678910111213def countBalls(self, lowLimit: int, highLimit: int) -> int: # 使用字典存储每个盒子中球的数量 box_count = {} # 遍历每个球的编号 for...
