实习冲刺第三十六天

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

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

相关推荐
KyollBM12 分钟前
【CF】Day44——Codeforces Round 908 (Div. 2) C + Codeforces Round 1020 (Div. 3) DE
算法
努力学习的小廉15 分钟前
我爱学算法之—— 二分查找(上)
开发语言·c++·算法
小彭律师23 分钟前
SinSR模型剪枝实验报告
人工智能·算法·剪枝
wqfhenanxc1 小时前
Mixing C++ and Rust for Fun and Profit 阅读笔记
c++·笔记·rust
R-G-B1 小时前
【MFC】 VS2022打开低版本的MFC,双击.rc文件,DIalog加载失败,页面弹窗fatal error RC***:cannot open*****
c++·mfc·vs打开较早版本mfc·双击.rc文件·dialog加载失败·fatal error rc·cannot open
敲上瘾1 小时前
基于Tcp协议的应用层协议定制
linux·运维·服务器·网络·c++·网络协议·tcp/ip
莹莹学编程—成长记2 小时前
string的模拟实现
服务器·c++·算法
喵先生!5 小时前
C++中的vector和list的区别与适用场景
开发语言·c++
xMathematics6 小时前
计算机图形学实践:结合Qt和OpenGL实现绘制彩色三角形
开发语言·c++·qt·计算机图形学·cmake·opengl
ShiinaMashirol7 小时前
代码随想录打卡|Day27(合并区间、单调递增的数字、监控二叉树)
java·算法