实习冲刺第三十六天

46.全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

复制代码
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

复制代码
输入:nums = [0,1]
输出:[[0,1],[1,0]]

思路详解:我们可以让数组中的每一个数充当首元素,然后使用dfs搜索数组中尚未被使用的元素依次排在首元素的后面,直到所有元素都被使用过了,我们就返回对应数组的结果集

代码详解;

cpp 复制代码
class Solution {
public:
    vector<vector<int>> ans;//定义存储结果集的数组
    vector<int> combine;//定义存储当前组合的数组
    vector<bool>used;//定义标记数组,用以记录数字是否被使用过
    vector<vector<int>> permute(vector<int>& nums) {
        used=vector<bool>(nums.size());//初始化标记数组大小
        dfs(nums,0);//调用搜索函数
        return ans;
    }

    void dfs(vector<int>& nums,int index)//搜索函数
    {
        if(index==nums.size())//如果最后一个位置也被枚举完了就将当前组合加入
        {
            ans.push_back(combine);
            return;
        }
        for(int i=0;i<nums.size();i++)//否则继续查找是否有合适的数字
        {
            if(!used[i])//如果数字未被使用,就加入
            {
                combine.push_back(nums[i]);
                used[i]=true;//更新使用状态
                dfs(nums,index+1);//搜索下一个位置
                used[i]=false;//回溯
                combine.pop_back();//从当前组合中删除
            }
        }
    }
};

面经:

  1. 什么是内存对齐,为什么要这么做

在C++中,内存对齐是指数据在内存中的存放地址与它的自然边界(即该数据大小的边界)对齐的行为。在结构体或类中,成员通常会按照其类型的最大对齐要求来对齐,结构体或类的整体对齐方式通常是成员中最大对齐要求的最小公倍数。

cpp 复制代码
struct Example {
    char a;    // 占用1字节
    int b;     // 占用4字节,通常要求4字节对齐
    char c;    // 占用1字节

};

// 在大多数系统上,这个结构体的大小不是6字节,而是12字节或更多,因为:
// a后面会有3个字节的填充,以确保int类型的b是4字节对齐的。
// b后面会有3个字节的填充,以确保整个结构体的大小是最大成员int的对齐要求(通常是4字节)的倍数。

为什么需要内存对齐:

  1. 性能优化:

对齐的内存访问更高效。许多处理器在访问非对齐的数据时会降低系统整体性能,因为它们可能需要多次内存访问来读取或 写入一个值,或者有的处理器可能不支持非对齐访问,这会导致程序运行时出错。

  1. 硬件要求:

某些硬件平台只能从特定地址开始读取特定类型的数据。例如,32位的数据可能需要从4的倍数的地址开始。

  1. 兼容性:

当不同的编译器或者不同的硬件平台之间进行交互时,保证数据结构是按照一定的规则对齐的,可以确保二进制兼容性。

  1. 数据对齐可能减少填充:

在结构体和类中,合理的内存对齐可以减少因对齐而引入的填充字节,从而节省内存空间。

相关推荐
hn小菜鸡39 分钟前
LeetCode 377.组合总和IV
数据结构·算法·leetcode
Deepoch1 小时前
Deepoc 大模型:无人机行业的智能变革引擎
人工智能·科技·算法·ai·动态规划·无人机
heimeiyingwang9 天前
【深度学习加速探秘】Winograd 卷积算法:让计算效率 “飞” 起来
人工智能·深度学习·算法
LyaJpunov9 天前
深入理解 C++ volatile 与 atomic:五大用法解析 + 六大高频考点
c++·面试·volatile·atomic
小灰灰搞电子9 天前
Qt PyQt与PySide技术-C++库的Python绑定
c++·qt·pyqt
时空自由民.9 天前
C++ 不同线程之间传值
开发语言·c++·算法
ai小鬼头9 天前
AIStarter开发者熊哥分享|低成本部署AI项目的实战经验
后端·算法·架构
小白菜3336669 天前
DAY 37 早停策略和模型权重的保存
人工智能·深度学习·算法
zeroporn9 天前
以玄幻小说方式打开深度学习词嵌入算法!! 使用Skip-gram来完成 Word2Vec 词嵌入(Embedding)
人工智能·深度学习·算法·自然语言处理·embedding·word2vec·skip-gram
Ray_19979 天前
C++二级指针的用法指向指针的指针(多级间接寻址)
开发语言·jvm·c++