实习冲刺第三十六天

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. 数据对齐可能减少填充:

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

相关推荐
我不会编程55522 分钟前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
懒羊羊大王&1 小时前
模版进阶(沉淀中)
c++
owde1 小时前
顺序容器 -list双向链表
数据结构·c++·链表·list
第404块砖头1 小时前
分享宝藏之List转Markdown
数据结构·list
GalaxyPokemon1 小时前
Muduo网络库实现 [九] - EventLoopThread模块
linux·服务器·c++
W_chuanqi2 小时前
安装 Microsoft Visual C++ Build Tools
开发语言·c++·microsoft
hyshhhh2 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
蒙奇D索大2 小时前
【数据结构】第六章启航:图论入门——从零掌握有向图、无向图与简单图
c语言·数据结构·考研·改行学it
A旧城以西2 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea
tadus_zeng2 小时前
Windows C++ 排查死锁
c++·windows