当前位置: 首页 > news >正文

从C语言到C++_39(C++笔试面试题)next_permutation刷力扣

这篇就一直更新一些C++的选择题和编程题了。

目录

笔试题1

答案及解析1

笔试题2

答案及解析2

力扣编程题

88. 合并两个有序数组

解析代码

349. 两个数组的交集

解析代码

60. 排列序列

解析代码

46. 全排列

解析代码

本篇完。


笔试题1

1. 以下哪种STL容器中的对象是连续存储的:()

A.list

B.vector

C.map

D.set

2. STL中的一级容器有:()

A.vector、deque、list、set、multiset、map、multimap

B.序列式容器、关联式容器、容器适配器

C.set、multiset、map、multimap

D.vector、deque、list

3. 以下STL的容器存放的数据,哪个肯定是排好序的()

A.vector

B.deque

C.list

D.map

4. 当很频繁地对序列中部进行插入和删除操作时,应该选择使用的容器是()

A.vector

B.list

C.deque

D.stack

5. 下面有关vector和list的区别,描述错误的是? ()

A.vector拥有一段连续的内存空间,因此支持随机存取,如果需要高效的随即存取

B.list拥有一段不连续的内存空间,如果需要大量的插入和删除,应该使用list

C.vector<int>::iterator支持“+”、“+=”、“<”等操作符

D.list<int>::iterator则不支持“+”、“+=”、“<”等操作符运算,但是支持了[ ]运算符

6. 关于vector<>初始化问题下面那个是非法的? ()

A.vector<string> sVec;

B.vector<vector<int>> ivvec;

C.vector<vector<string>> svvec( "hello");

7. T是一个数据类型,关于std::vector::at 和 std::vector::operator[] 描述正确的是: ()

A.at总是做边界检查, operator[] 不做边界检查

B.at不做边界检查, operator[] 做边界检查

C.at和operator[] 是一样的

D.at下标越界抛异常,operator[]下标越界触发断言

8. STL中的unordered_map和priority_queue使用的底层数据结构分别是什么?()

A.rbtree,queue

B.hashtable,heap

C.rbtree,heap

D.hashtable,queue

9. map和unordered_map的区别说法错误的是()

A.map的底层是红黑树,unordered_map的底层结构是哈希表

B.map是有序的,unordered_map不是,且map的查询效率更高

C.map和unordered_map底层存储的都是键值对

D.map和unordered_map的应用场景不同

10. 下面关于deque说法正确的是()

A.deque没有vector尾插效率高

B.deque的底层是一段连续空间

C.如果要对集合中的元素进行排序时,元素不适合放在deque中

D.deque是priority_queue的底层默认容器

答案及解析1

1. B

  A:错误,list的底层结构为带头结点的双向循环链表,是链式结构

  B:正确,vector是动态类型顺序表,底层是一段连续空间

  C:错误,map底层是红黑树,树形结构

  D:错误,set底层是红黑树,树形结构

2. D

  一级容器即序列式容器(存的不是)

  A:错误,set、multiset、map、multimap是关联式容器,不是序列式容器

  B:错误,非题目所问

  C:错误,都是关联式容器

  D:正确

3. D

map的底层是红黑树,红黑树是二叉搜索树,二叉搜索树中的元素如果按照中序遍历,可以得到一个有序序列

4. B

频繁的向序列中插入和删除元素时,应该选择链式结构

list底层结构为:带头结点的双向循环链表

5. C

  A:正确:构造了一个空的vector,里面放置的是string类型的对象

  B:正确:构造了一个空的动态二维数组

  C:错误,svvec是二维的,vector套vector,不能直接使用"hello"构造

6. C

  A:正确:构造了一个空的vector,里面放置的是string类型的对象

  B:正确:构造了一个空的动态二维数组

  C:错误,svvec是二维的,vector套vector,不能直接使用"hello"构造

7. D

  at和operator[]都是通过下标获取对应的元素,两个的不同是:

  at在下标越界时,抛异常

  operator[]在下标越界时,触发断言

8. B

unordered_map底层使用的是哈希表,priority_queue底层使用的是堆

9. B

  A:正确

  B:错误,map底层是红黑树,查询效率为O(logN),unordered_map底层是哈希表,查询效率为 O(1), unordered_map查询的效率更高

  C:正确

  D:正确,map适合要求结果有序的常见,unordered_map适合是否有序无关,更关注查询效率的场景

10. C

  A:错误,如果在不扩容的情况下deque和vector相同,需要扩容时就不同了,vector扩容需要搬移 大量的元素,deque不需要

  B:错误,deque是分段连续的,类似动态的二维数组

  C:正确,因为要排序就需要遍历,而deque不适合编译,因为其在遍历时,要不断的去检测迭代 器是否在空间边界

  D:错误,priority_queue底层的默认容器是vector

笔试题2

1. 下面关于适配器说法正确的是()

A.在STL中,stack和queue与vector一样,都是容器

B.STL中只有容器适配器

C.适配器有自己独立的底层数据结构,不需要借助其他结构

D.适配器是一种设计模式,该种模式是将一个接口包装成客户希望的另一个接口

2. 下面哪一个不是适配器()

A.stack

B.queue

C.反向迭代器

D.以上都是

3. 关于仿函数说法正确的是()

A.仿函数就是一个函数

B.仿函数可以是静态成员函数

C.仿函数是函数对象,可以像函数调用方式使用的对象

D.仿函数与函数指针作用不同

4. 关于仿函数说法错误的是()

A.仿函数可以使算法功能更加灵活

B.如果想要让一个类的对象按照函数方式使用,只需在其中将()重载即可

C.lambda表达式底层实际就是按照仿函数实现的

D.仿函数与函数指针都可以增加算法的灵活性

5. 填写下面空格

1. merge()算法的功能是:_______________________________________________

2. reverse()算法的功能是:_____________________________________________

3. unique()算法的功能是:______________________________________________

4. next_permutation()算法的功能是:____________________________________

5. sort()算法的功能是:_______________________________________________

答案及解析2

1. D

  A:错误,在STL中stack和queue被认为是容器适配器,因为它们的底层结构是直接将deque封装 了一下

  B:错误,除了容器适配器,还有迭代器适配器,函数适配器

  C:错误,适配器没有自己独立的底层数据结构,是将其他结构拿过来重新包装的

  D:正确,迭代器模式概念

2. D

  A:正确,stack是对deque的重新封装

  B:正确,queue是对deque的重新封装

  C:正确,反向迭代器失对正向迭代器的封装

  D:错误

3. C

  A:错误,仿函数是一个类中重载了(),该类的对象可以像函数一样使用的对象

  B:错误,仿函数是依靠对象调用的,没有对象无法使用,因为不能是静态成员函数

  C:正确

  D:错误,作用基本是类似的,都是增加算法的灵活性,只不过C++中使用仿函数更多

4. B

A:正确,STL中的算法都是通用的,有些算法具体的做的事情需要用户通过仿函数方式定制

B:错误,是重载()而不是(],注意看题

C:正确,lambda表达式编译器在编译时会在底层将其转化为仿函数

D:正确

  1. merge(first1, last1,first2,last2, resutl)算法的功能是:将两个有序序列合并成一个序列保存到result中,合并好之后依然有序
  2. reverse(first, last)算法的功能是:对[first, last)区间中的元素逆序
  3. unique(first, last)算法的功能是:对[first, last)区间中的元素去重
  4. next_permutation(first,last)算法的功能是:获取当前序列的下一个排列组合
  5. sort(first,last)算法的功能是:对[first, last)区间中的元素排序,重载版本可以指定排升序还是降序

力扣编程题

88. 合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

示例 1:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

示例 2:

输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果是 [1] 。

示例 3:

输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。

提示:

  • nums1.length == m + n
  • nums2.length == n
  • 0 <= m, n <= 200
  • 1 <= m + n <= 200
  • -109 <= nums1[i], nums2[j] <= 109

解析代码

C语言写过了,双指针

class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int end = m + n - 1; // 双指针if(m == 0){nums1[0] = nums2[0];}while(n > 0 && m > 0){if(nums1[m-1] >= nums2[n-1]) // 小的放后面{nums1[end--] = nums1[m-1];m--;}else{nums1[end--] = nums2[n-1];n--;}}while(n > 0) // 第二个数组还有就拷贝过去{nums1[end--] = nums2[n-1];n--;}}
};

349. 两个数组的交集

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

解析代码

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set s1(nums1.begin(),nums1.end()); // 去重unordered_set s2(nums2.begin(),nums2.end());vector<int> retV;if(s1.size() <= s2.size()){for(const auto& e : s1){if(s2.find(e) != s2.end()){retV.push_back(e);}}}else{for(const auto& e : s2){if(s1.find(e) != s1.end()){retV.push_back(e);}}}return retV;}
};

60. 排列序列

给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。

按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"

给定 n 和 k,返回第 k 个排列。

示例 1:

输入:n = 3, k = 3
输出:"213"

示例 2:

输入:n = 4, k = 9
输出:"2314"

示例 3:

输入:n = 3, k = 1
输出:"123"

提示:

  • 1 <= n <= 9
  • 1 <= k <= n!

解析代码

这题是困难题,和下面一题一样应该不提倡用next_permutation的,但没学高阶算法就先这样用了

next_permutation函数在头文件<algorithm>中,作用是是生成给定序列的下一个较大排序,直到序列按降序排列为止。到这里还需要强调的一点是,如果你希望生成所有的排列方式,一定要先将序列按升序排列,这里可以与sort函数结合起来使用,先用sort升序排列,再调用next_permutation函数。

class Solution {
public:string getPermutation(int n, int k) {string str = string("123456789").substr(0,n);while(--k){next_permutation(str.begin(), str.end());}return str;}
};

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]]

示例 3:

输入:nums = [1]
输出:[[1]]

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

解析代码

提倡不用next_permutation的,但没学高阶算法就先这样用了,先用sort升序排列

class Solution {
public:vector<vector<int>> permute(vector<int>& nums) {vector<vector<int>> vv;sort(nums.begin(), nums.end());do{vv.push_back(nums);}while(next_permutation(nums.begin(), nums.end()));return vv;}
};

本篇完。

C++到这基本介绍了,有时间可以回去复习复习,还有一两篇关于多线程的问题放到Linux操作系统之后再放出来了,到这C++也够用了。

下一篇:零基础Linux_1(前期准备)Linux发展史和环境安装。

下下篇:零基础Linux_2(基本指令_上)目录/文件的显示跳转创建删除。

相关文章:

从C语言到C++_39(C++笔试面试题)next_permutation刷力扣

这篇就一直更新一些C的选择题和编程题了。 目录 笔试题1 答案及解析1 笔试题2 答案及解析2 力扣编程题 88. 合并两个有序数组 解析代码 349. 两个数组的交集 解析代码 60. 排列序列 解析代码 46. 全排列 解析代码 本篇完。 笔试题1 1. 以下哪种STL容器中的对象…...

适用于Linux的Windows子系统(系统安装步骤)

目录 前言 一、WSL2安装 1.Microsoft参考文档&#xff08;推荐选择旧版 WSL 的手动安装步骤&#xff09; 2.开启子系统 二、Ubuntu安装 1.在Microsoft Store中获取ubuntu 2.运行ubuntu配置管理信息 3.ubuntu换源 三、WSL 与 Ubuntu的一些基础使用命令 四、Windows Terminal终端…...

HarmonyOS/OpenHarmony(Stage模型)应用开发组合手势(二)并行识别

并行识别组合手势对应的GestureMode为Parallel。并行识别组合手势中注册的手势将同时进行识别&#xff0c;直到所有手势识别结束。并行识别手势组合中的手势进行识别时互不影响。 以在一个Column组件上绑定点击手势和双击手势组成的并行识别手势为例&#xff0c;由于单击手势和…...

如何使用GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图

GPT对于每个科研人员已经成为不可或缺的辅助工具&#xff0c;不同的研究领域和项目具有不同的需求。例如在科研编程、绘图领域&#xff1a; 1、编程建议和示例代码: 无论你使用的编程语言是Python、R、MATLAB还是其他语言&#xff0c;都可以为你提供相关的代码示例。 2、数据可…...

Blender中的高级边缘控制和纹理映射

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 步骤 1 首先&#xff0c;您需要创建一组无阴影材质&#xff0c;每种材质具有不同的颜色&#xff0c;确保您有足够的材质来覆盖模型&#xff0c;而不会有相同的颜色相互重叠。然后&#xff0c;切换到“着色”&#xff…...

从0开始学go第四天

模板继承 继承根模板&#xff0c;重新定义“块模板” 【Go Web开发系列教程】07-Go模板继承_哔哩哔哩_bilibili 解析模板时&#xff0c;base模板要在前 渲染模板时&#xff1a; 要用ExecuteTemplate&#xff0c;而不是Excute 模板补充&#xff1a;Go语言标准库之http/templ…...

【飞书ChatGPT机器人】飞书接入ChatGPT,打造智能问答助手

文章目录 前言环境列表1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 前言 在飞书中创建chatGPT机器人并且对话&#xff0c;在下面操作步骤中…...

vue3集成jsoneditor

一、背景 之前在做录制回放平台的时候&#xff0c;需要前端展示子调用信息&#xff0c;子调用是一个请求列表数组结构&#xff0c;jsoneditor对数组的默认展示结构是[0].[1].[2]..的方式&#xff0c;为了达到如下的效果&#xff0c;必须用到 onNodeName的钩子函数&#xff0c;…...

自然语言处理 中文停用词词典

我整合了4个常用的中文停用词词典&#xff08;https://gitcode.net/mirrors/goto456/stopwords/-/tree/master&#xff09;&#xff0c;剔除了其中的非中文词汇&#xff0c;得到停用词词典如下&#xff0c;可直接取用。 看见 并不是 有著 岂非 毫无保留地 这样 么 哎呀 互相 通…...

CocosCreator3.8研究笔记(十)CocosCreator 图像资源的理解

一、图像资源导入 Cocos Creator 可使用图像文件格式&#xff0c;支持 JPG、PNG、BMP、TGA、HDR、WEBBP、PSD、TIFF 等。 将图像资源直接拖拽到 资源管理器 即可将其导入 二、图像资源的类型 在 属性检查器 面板中便可根据需要设置图像资源的使用类型&#xff1a;raw 、 textu…...

计算机使用中常用截图与标注方法

一、截图常用方法 1&#xff0e;windows自带快捷键 Print Screen SysPq 截取全屏&#xff0c;可以粘到word文档中&#xff0c;可以粘贴到"画图"程序中&#xff0c;命名一个文件名&#xff0c;另存为图片&#xff0c;或.jpg后缀&#xff0c;或.png后缀 alt Print S…...

Elasticsearch,Logstash和Kibana安装部署(ELK Stack)

前言 当今数字化时代&#xff0c;信息的快速增长使得各类组织和企业面临着海量数据的处理和分析挑战。在这样的背景下&#xff0c;ELK Stack&#xff08;Elasticsearch、Logstash 和 Kibana&#xff09;作为一套强大的开源工具组合&#xff0c;成为了解决数据管理、搜索和可视…...

MATLAB中movmean函数用法

目录 语法 说明 示例 向量的中心移动平均值 向量的尾部移动平均值 矩阵的移动平均值 包含缺失值的向量的移动平均值 基于样本点计算移动平均值 仅返回满窗口平均值 movmean函数的功能是对数据进行移动求平均值。 语法 M movmean(A,k) M movmean(A,[kb kf]) M mov…...

IIS短文件名泄露漏洞复现

IIS短文件名泄露漏洞复现 前言一、漏洞描述二、漏洞原理1.什么是短文件2.短文件特征 三、漏洞验证三、漏洞防御总结 前言 IIS短文件名泄露漏洞比较老了&#xff0c;而且只适合于windowsiisasp的网络结构&#xff0c;所有如下的复现步骤看下就行了&#xff0c;关键是要弄懂原理…...

万字解读 Android 车机核心 :CarService 的构成和链路~

前言 关于 Android 车机&#xff0c;之前分析过方控上自定义按键的输入机制和中控上旋钮输入的原理&#xff0c;但都局限于 Car Service 内 Input 相关模块。 一文了解 Android 车机如何处理中控的旋钮输入从实体按键看 Android 车载的自定义事件机制 本文将结合 Android 系…...

C#使用Panel

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System...

Jabbi的Rust学习日记(一)

Rust环境安装 Windows:Install Rust - Rust Programming Language (rust-lang.org) 访问网页&#xff0c;下载64bit | 32bit 版本 下载完成后打开&#xff0c;直接enter即可 Linux:输入指令 curl https://sh.rustup.rs-sSf | sh 我会报错&#xff0c;好像是链接不到这个网址&a…...

电脑磁盘分区形式是什么?如何更改?

磁盘分区形式介绍 在了解为什么以及如何更改分区形式之前&#xff0c;让我们对磁盘分区形式有一个基本的了解。一般来说&#xff0c;分区形式是指主引导记录&#xff08;MBR&#xff09;和 GUID 分区表&#xff08;GPT&#xff09;。 MBR和GPT是Windows系统中常用…...

Outlook无需API开发连接钉钉群机器人,实现新增会议日程自动发送群消息通知

Outlook用户使用场景&#xff1a; 在企业中&#xff0c;会议和活动的顺利举行对于业务运转和团队协作至关重要。然而&#xff0c;计划的变动总是无法避免&#xff0c;这可能会导致其他人的计划受到影响&#xff0c;打乱原有的安排。为了解决这个问题&#xff0c;许多企业开始使…...

elasticsearch分析插件 安装analysis-ik

首先下载安装es 和 插件 &#xff0c;注意 两者的版本要保持一致,如果要用到kibana 则三者保持一致 ik&#xff1a;https://github.com/medcl/elasticsearch-analysis-ik/releases es/kibana&#xff1a;https://www.elastic.co/cn/downloads/past-releases/ 然后在 es— elast…...

2023年股票大宗减持研究报告

第一章 股票大宗减持概述 1.1 概念 大宗减持是指通过大宗交易的方式进行减持&#xff0c;即达到规定的最低限额的证券单笔买卖申报&#xff0c;买卖双方经过协议达成一致并经交易所确定成交的证券交易&#xff0c;其中A股单笔交易数量在30万股&#xff08;含&#xff09;以上…...

VS编译.cu文件源文件无法打开matrix.h和mex.h问题

配置好cu和VS相关库文件后CUDA程序仍然报错&#xff1a;无法打开matrix.h和mex.h&#xff0c;解决办法&#xff1a; &#xff08;1&#xff09;这两个头文件是matlab中的&#xff0c;可能无法直接在VS中调用&#xff0c;可以通过添加外部依赖项的方法将matlab中的头文件的文件路…...

小bugs搜集和解决方法,亲测有效(2022-2023)

有些小bugs几行指令就能解决&#xff0c;写太多不好&#xff0c;这里就进行一个2022-2023这段时间的bugs collection和solution。 Deep Learning How to make really empty tensor? a nn.Torch([]) b torch.empty(2,3) for i in rang(3):a torch.cat(a, b, dim0)Mismatc…...

归并排序和快速排序的两种实现

在此之前我们已经介绍过归并排序和快速排序&#xff1a;浅谈归并排序与快速排序&#xff0c;但其中的实现都是基于递归的。本文将重新温故这两种算法并给出基于迭代的实现。 目录 1. 归并排序1.1 基于递归1.2 基于迭代 2. 快速排序2.1 基于递归2.2 基于迭代 1. 归并排序 1.1 基…...

C#,《小白学程序》第十四课:随机数(Random)第一,几种随机数的计算方法与代码

1 文本格式 /// <summary> /// 《小白学程序》第十四课&#xff1a;随机数&#xff08;Random&#xff09;第一&#xff0c;几种随机数的计算方法与代码 /// 本课初步接触一下随机数。 /// </summary> /// <param name"sender"></param> ///…...

[杂谈]-快速了解Modbus协议

快速了解Modbus协议 文章目录 快速了解Modbus协议1、为何 Modbus 如此受欢迎2、范围和数据速率3、逻辑电平4、层数5、网络与通讯6、数据帧格式7、数据类型8、服务器如何存储数据9、总结 ​ Modbus 是一种流行的低速串行通信协议&#xff0c;广泛应用于自动化行业。 该协议由 Mo…...

WhatsApp的两个商业模式该如何选择

WhatsApp Business 是什么 目前 WhatsApp 提供两种商业模式&#xff0c;企业应根据自身需求选择相应版本。 第一个版本是 WhatsApp Business&#xff1a;初创企业只需一个手机应用程序&#xff0c;便可以个体单位与客户轻松互动; 另一个版本是 WhatsApp Business API&#xff…...

动态表单设计

动态表单设计 背景方案讨论基于上面分析&#xff0c;对比调研&#xff0c;自定义动态表单数据模型表单详解&#xff08;一&#xff09; 表单模板&#xff1a;jim_dynamic_form&#xff08;二&#xff09;表单数据类型&#xff1a;jim_form_data_type&#xff08;三&#xff09;…...

JAR will be empty - no content was marked for inclusion!

现象 在对自建pom依赖组件打包时&#xff0c;出现JAR will be empty - no content was marked for inclusion!错误。 方案 在pom中怎么加packaging标签内容为pom&#xff0c;标识只打包pom文件 <?xml version"1.0" encoding"UTF-8"?> ...<grou…...

软件生命周期及流程【软件测试】

软件的生命周期 软件生命周期是软件开始研制到最终被废弃不用所经历的各个阶段。 瀑布型生命周期模型 规定了它们自上而下、相互衔接的固定次序&#xff0c;如同瀑布流水&#xff0c;逐级下落&#xff0c;具有顺序性和依赖性。每个阶段规定文档并需进行评审。 特点&#xff…...