实习冲刺第三十六天

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

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

相关推荐
打工仔折腾 AI3 小时前
让时序预测真正参与决策:TimechoAI 工程化落地与管线设计实践
人工智能·后端·python·算法·机器学习·性能优化
Light604 小时前
企业自建 AI 智能体,成本差 8 倍还是 46 倍?
java·人工智能·算法·知识图谱·rag·ai agent 上下文·token 成本
曹牧4 小时前
VS: Visual Studio 里把未包含的文件加进项目2
linux·运维·算法
艾莉丝努力练剑4 小时前
【AI大模型接入SDK】ChatServer HTTP接口模块实现总览
网络·c++·人工智能·网络协议·学习·http·架构
重生之小比特4 小时前
【算法拾光】滑动窗口|长度最小的子数组 + 无重复字符的最长子串
算法
坤坤子吖4 小时前
Linux 线程概念与控制——线程创建、退出与等待
linux·开发语言·c++·笔记·学习
weixin_307779134 小时前
C++代码实现MATLAB中的fitnlm函数功能
开发语言·c++·算法·matlab
雪落漂泊4 小时前
C++算法:双指针篇(下)
数据结构·c++·算法
生态学者14 小时前
Global Change Biology | 森林越“步调一致”,反而越怕干旱?树木生长与叶片活动的同步之谜
大数据·人工智能·算法·r语言·微信公众平台