【算法】求最小子集的和被5整除

2023-05-16

昨天面试了一家公式,面试上来问我,使用过哪些STL容器,我说了一下,然后又问从最简单的开始说。

面试官:说说使用vector是需要注意什么?

我:注意什么......。迭代器失效问题。

面试官:你是看面经的吧

我:我没有看面经,平时就刷题用用这些容器,使用时需要注意什么,使用时需要注意什么(我连说两遍),平时就是用,没注意到有什么。

面试官:好吧,有看过STL源码剖析吗?

我:内心:我刷过侯捷老师的视频,但是书没看过,看的比较久了,基本上已经忘了。于是脱口而出,没看过。

面试官:好吧,你有了解什么性能优化的工具吗

我:我注意到贵公司的笔试题中有类似的问题,我就只知道valgrind,但是没用过。

面试官:好吧,那你做完笔试,有没有了解过呢?

我:没有。

面试官呵呵一笑:那你了解图吗?

我:图我就知道有向图、无向图,图的算法:迪杰斯特拉、克鲁斯卡尔(没记错的话)

面试官:图的存储呢?

我:邻接表,邻接矩阵

面试官:那什么时候用邻接表、邻接矩阵呢?

我:秋招这么久,没有面试官问过我关于图的算法,这几个算法是我之前看的。现在有点忘了。

面试官:(很惊讶),竟然没有人问过你图,好吧。你有参与过或者做过什么开源的项目吗?

我:项目没有做过,看过levelDB源码中的切片和内存分配部分。

面试官:好吧,那我们先做一道在线编程,我看看你的编程习惯,你用你熟悉的环境。

我:我熟练的打开VS,面试官把题发了过来

给定一个正整数集合S。该集合中的元素很多(大于100万),而且该集合满足以下条件:   
条件A: 集合中的所有元素之和能被正整数P=5整除。?
    
1.请你设计并实现一个程序,求出S的一个最小子集(最小的定义是集合元素个数最少)T,使得T也满足条件A. ?
示例:当P=5的时候,
如果
Case1: 输入 S = {1, 2, 3, 4, 5}, 则输出 T = {5} (元素个数为1)
Case2: 输入 S = {1,2,3,4}, 则输出 T = {1, 4} 或 T = {2, 3}
Case3: ?输入 S = {1,2,6,7,12,17}, 则输出 T = {1,2,7} 或 T = {6,12,17}
Case4: ?输入 S = {1,2,6,7,11, 12,13, 14, 17, 22}, 则输出 T = {1,14} 或 T = {2, 13}?...?
注意:任意输出一个最小子集即可,不要求输出所有的最小子集。

我最开始想的是暴力,思考了有3-5min,发现不行,后来想到可以用回溯求出所有子集,然后再根据子集去找,写了半天,没写出来怎么求子集(真是蠢,平时都可以的),后面面试官说了他的思路,先按下不提,我这里先把自己的思路再写写。

(1)首先求子集;

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;


// 求最小子集的和被5整除

vector<vector<int>> res;     // 存放所有子集
vector<int> path;            // 存放子集

void helper(vector<int>& nums, int index) {
	res.push_back(path);
	// 终止条件
	if (index >= nums.size()) {
		return;
	}

	for (int i = index; i < nums.size(); i++) {
		path.push_back(nums[i]);
		helper(nums, i + 1);
		path.pop_back();
	}
}

int main(int argc, char** argv) {

	res.clear();
	path.clear();
	vector<int> nums = { 1,2,3,4,5 };
	helper(nums, 0);

	for (int i = 0; i < res.size(); i++) {
		for (int j = 0; j < res[i].size(); j++) {
			cout << res[i][j];
		}
		cout << endl;
	}

	system("pause");
	return 0;
}

测试

(2)对子集进行判断;

path中存储的是某个子集,res中存储的是所有子集,需要对所有子集进行遍历;需要求的是最小的子集,那么先对子集path按照个数排序

// 我这里贴是核心代码
static bool cmp(vector<int>& a, vector<int>& b) {
	return a.size() < b.size();
}

sort(res.begin(), res.end(), cmp);
for (int i = 0; i < res.size(); i++) {
	for (int j = 0; j < res[i].size(); j++) {
		cout << res[i][j];
	}
	cout << endl;
}

测试

(3)对子集求和,找出满足条件的最小子集

子集已经排序了,直接遍历找到第一个满足的就行

// 贴的核心代码

// 求和函数
int add(vector<int>& nums) {
	int sum = 0;
	for (auto num : nums) {
		sum += num;
	}
	return sum;
}


	for (int i = 0; i < res.size(); i++) {
		// 去掉空集
		if (res[i].size() == 0) {
			continue;
		}

		if (add(res[i]) % 5 == 0) {
			for (auto num:res[i]) {
				cout << num << "\t";
			}
			break;
		}
	}

测试

换一组数据

S = {1,2,6,7,11, 12,13, 14, 17, 22}

 6和14是满足的,

but,使用了回溯,整个程序复杂度就提上来了,也总算写出了(苦笑)

注:上述代码在面试过程中并没有写出来,今天早上复盘的时候才写出来的

贴上整体代码:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

/*
给定一个正整数集合S。该集合中的元素很多(大于100万),而且该集合满足以下条件:   
条件A: 集合中的所有元素之和能被正整数P=5整除。?
	
1.请你设计并实现一个程序,求出S的一个最小子集(最小的定义是集合元素个数最少)T,使得T也满足条件A. ?
示例:当P=5的时候,
如果
Case1: 输入 S = {1, 2, 3, 4, 5}, 则输出 T = {5} (元素个数为1)
Case2: 输入 S = {1,2,3,4}, 则输出 T = {1, 4} 或 T = {2, 3}
Case3: ?输入 S = {1,2,6,7,12,17}, 则输出 T = {1,2,7} 或 T = {6,12,17}
Case4: ?输入 S = {1,2,6,7,11, 12,13, 14, 17, 22}, 则输出 T = {1,14} 或 T = {2, 13}?...?
注意:任意输出一个最小子集即可,不要求输出所有的最小子集。

*/

// 求最小子集的和被5整除

vector<vector<int>> res;     // 存放所有子集
vector<int> path;            // 存放子集

void helper(vector<int>& nums, int index) {
	res.push_back(path);
	// 终止条件
	if (index >= nums.size()) {
		return;
	}

	for (int i = index; i < nums.size(); i++) {
		path.push_back(nums[i]);
		helper(nums, i + 1);
		path.pop_back();
	}
}

// 排序
static bool cmp(vector<int>& a, vector<int>& b) {
	return a.size() < b.size();
}

// 求和函数
int add(vector<int>& nums) {
	int sum = 0;
	for (auto num : nums) {
		sum += num;
	}
	return sum;
}


int main(int argc, char** argv) {

	res.clear();
	path.clear();
	vector<int> nums = { 1,2,6,7,11, 12,13, 14, 17, 22 };
	helper(nums, 0);

	for (int i = 0; i < res.size(); i++) {
		for (int j = 0; j < res[i].size(); j++) {
			cout << res[i][j];
		}
		cout << endl;
	}
	cout << "************************" << endl;

	sort(res.begin(), res.end(), cmp);
	for (int i = 0; i < res.size(); i++) {
		for (int j = 0; j < res[i].size(); j++) {
			cout << res[i][j];
		}
		cout << endl;
	}

	cout << "************************" << endl;

	for (int i = 0; i < res.size(); i++) {
		// 去掉空集
		if (res[i].size() == 0) {
			continue;
		}

		if (add(res[i]) % 5 == 0) {
			for (auto num:res[i]) {
				cout << num << "\t";
			}
			break;
		}
	}

	system("pause");
	return 0;
}

话接上回,我用回溯没有写出来,说了一下我的思路,面试官和我说了他的思路

【可以先预处理一波,所有数字先对5取余,得到的数字是在0-4范围内,然后再用5个桶,类似桶排序,把数字存起来,再进行判断(取余、存储我理解了,那么怎么和原数据进行对应的)】,我没有理解面试官后面的意思(苦笑),也没有顺着他的思路写出来。

面试官:你这个回溯的复杂度是多少,你了解代码的复杂度吗,

我:代码的复杂度分为时间复杂度和空间复杂度,回溯的复杂度,我还不会分析(尴尬)。

后面就聊聊我的基本情况,今年的大环境。面试官人很好,是大佬级别的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【算法】求最小子集的和被5整除 的相关文章

  • STL学习笔记之迭代器--iterator

    STL设计的精髓在于 xff0c 把容器 xff08 Containers xff09 和算法 xff08 Algorithms xff09 分开 xff0c 彼此独立设计 xff0c 最后再用迭代器 xff08 Iterator xff0
  • 提升工作效率之PCB设计软件“立创EDA”

    文章目录 前言一 立创EDA二 PCB生产三 团队功能总结 前言 由于工作需要设计一款硬件调试小工具 xff0c 考虑到器件采购和PCB制版都在立创商城上进行 xff0c 索性就试用立创EDA进行PCB设计 结论在前 xff1a 立创线上E
  • nvidia显卡,驱动以及cuda版本对应查询

    实验室新买了一块rtx 2080和titan rtx xff0c 需要分别配置驱动和cuda xff0c 但是一直也找不到显卡和cuda的官方对照表 xff0c 每次都是百度 谷歌 必应 xff0c 参考别人安装之旅 今天突然发现了驱动和c
  • LoRa 信噪比和接收灵敏度

    文章目录 前言一 信噪比极限 xff08 SNR LIMIT xff09 二 接收灵敏度 前言 介绍信噪比极限和如何计算接收灵敏度 参考资料 xff1a LoRa信噪比和接收灵敏度 一 信噪比极限 xff08 SNR LIMIT xff09
  • C在字符串后面加/0和0

    使用复制字符串时 xff0c 经常会遇到字符串后面跟着一大堆莫名其妙的字符串 xff0c 例如屯屯屯 之类的东西 xff0c 这是因为在使用字符串时没有在字符串结尾加 0或0 通常分配一块内存到堆上或栈上时 xff0c 内存区域可能会有之前
  • 基于k8s+prometheus实现双vip可监控Web高可用集群

    目录 一 规划整个项目的拓扑结构和项目的思维导图 二 修改好各个主机的主机名 xff0c 并配置好每台机器的ip地址 网关和dns等 2 1修改每个主机的ip地址和主机名 2 2 关闭firewalld和selinux 三 使用k8s实现W
  • PX4源码开发人员文档(一)——软件架构

    软件架构 PX4 在广播消息网络内 xff0c 按照一组节点 xff08 nodes xff09 的形式进行组织 xff0c 网络之间使用像如 姿态 和 位置 之类的语义通道来传递系统状态 软件的堆栈结构主要分为四层 应用程序接口 提供给a
  • ardupilot线程理解

    对于apm和pixhawk一直存在疑惑 xff0c 到现在还不是特别清楚 今天在http dev ardupilot com 看到下面的说明 xff0c 感觉很有用 xff0c 对于整体理解amp代码很有帮助 xff0c 所以记下来 转载请
  • Pixhawk源码笔记三:串行接口UART和Console

    这里 xff0c 我们对 APM UART Console 接口进行讲解 如有问题 xff0c 可以交流30175224 64 qq com 新浪 64 WalkAnt xff0c 转载本博客文章 xff0c 请注明出处 xff0c 以便更
  • C/C++中二维数组和指针关系分析

    在C c 43 43 中 xff0c 数组和指针有着密切的关系 xff0c 有很多地方说数组就是指针式错误的一种说法 这两者是不同的数据结构 其实 xff0c 在C c 43 43 中没有所谓的二维数组 xff0c 书面表达就是数组的数组
  • 四叉树空间索引原理及其实现

    今天依然在放假中 xff0c 在此将以前在学校写的四叉树的东西拿出来和大家分享 四叉树索引的基本思想是将地理空间递归划分为不同层次的树结构 它将已知范围的空间等分成四个相等的子空间 xff0c 如此递归下去 xff0c 直至树的层次达到一定
  • DirectXShaderCompiler mac编译

    Directxshader compiler mac编译 1 前置条件 Please make sure you have the following resources before building GitPython Version
  • intel -tbb 源码cmake构建

    cmake minimum required VERSION 3 0 0 FATAL ERROR set CMAKE CXX STANDARD 17 project tbb CXX add library tbb SHARED void c
  • 如何修改数据库密码

    多可文档管理系统是自带数据库的 xff0c 就是你在安装多可文档管理系统的同时 xff0c 数据库就已经自动安装上了 这个数据库有个默认密码 xff0c 为了数据库里的数据安全 xff0c 建议你安装完多可后 xff0c 就立刻修改数据库的
  • iOS编译openmp

    1 下载openmp源码 https github com llvm llvm project releases download llvmorg 14 0 6 openmp 14 0 6 src tar xz 2 下载ios toolch
  • 我的2013-从GIS学生到GIS职业人的飞跃

    我的 2013 从 GIS 学生GIS 职业人的飞跃 前言 xff1a 从末日中度过了 2012 年 xff0c 我们伟大的人类把这个世界末日的谎言给揭穿了 xff0c 但是不知不觉中 xff0c 2013 年又即将悄悄从我们身边溜走 xf
  • 矩阵的特征值和特征向量的雅克比算法C/C++实现

    矩阵的特征值和特征向量是线性代数以及矩阵论中非常重要的一个概念 在遥感领域也是经常用到 xff0c 比如多光谱以及高光谱图像的主成分分析要求解波段间协方差矩阵或者相关系数矩阵的特征值和特征向量 根据普通线性代数中的概念 xff0c 特征值和
  • windows多线程详解

    在一个牛人的博客上看到了这篇文章 xff0c 所以就转过来了 xff0c 地址是http blog csdn net morewindows article details 7421759 本文将带领你与多线程作第一次亲密接触 xff0c
  • tiff文件读取

    以下是VC下读取TIFF文件的代码 char szFileName 61 34 K 地图 fujian DEM fujian1 tif 34 TIFF tiff 61 TIFFOpen szFileName 34 r 34 打开Tiff文件

随机推荐

  • GIS开发人员需要掌握的知识和技能

    对于GIS行业 xff0c 可能很多人不是很了解 xff0c 对我来说也不是很了解 xff0c 在此呢 xff0c 我就我自己的看法发表一下简单的看法 xff0c 有什么不同的意见可以一起交流 GIS虽说是属于地理科学或者说测绘科学与技术的
  • GIS算法的一点理解

    在GIS这个专业也混了好几年了 xff0c 但是始终没有对GIS算法有过真正的研究 xff0c 可以说大部分不懂 目前关于GIS算法的书籍不是特别多 xff0c 数来数去也就那么几本 xff0c 南师大几个老师编写的地理信息系统算法基础 x
  • char*转LPCWSTR解决方案

    在Windows编程中 xff0c 经常会碰到字符串之间的转换 xff0c char 转LPCWSTR也是其中一个比较常见的转换 下面就列出几种比较常用的转换方法 1 通过MultiByteToWideChar函数转换 MultiByteT
  • 一阶互补滤波,二阶互补滤波,卡尔曼滤波

    一阶互补 a 61 tau tau 43 loop time newAngle 61 angle measured with atan2 using the accelerometer 加速度传感器输出值 newRate 61 angle
  • 项目实用makefile

    在上一篇文章 小项目实用makefile 中 xff0c 已经说明了单个makefile管理层次目录的局限性 本文 xff0c 主要总结一下项目中的一种实用makefile树写法 xff0c 为10来个人协作的中小型项目makefile编写
  • MPU6050工作原理及STM32控制MPU6050

    一 简介 1 要想知道MPU6050工作原理 xff0c 得先了解下面俩个传感器 xff1a 陀螺仪传感器 xff1a 陀螺仪的原理就是 xff0c 一个旋转物体的 旋转轴所指的方向在不受外力影响时 xff0c 是不会改变的 人们根据这个道
  • 自动驾驶(四十九)---------Kavser二次开发

    我们知道CAN总线是连接车身各个模块之间的桥梁 xff0c 通过协议通讯 xff0c 在车辆标定和测试中很多情况是用上位机和车身相连 xff0c 收发满足CAN总线的信号 这中间如何通讯呢 xff1f 这就需要用到Kavser Kvaser
  • Linux嵌入式设备时钟同步到硬件

    时间修改命令 date s 34 2022 06 27 11 51 02 34 同步到硬件 hwclock w 显示硬件时钟 hwclock r
  • linux opendir和readdir的使用

    1 opendir include lt sys types h gt include lt dirent h gt DIR opendir const char name 传入name路径 xff0c 成功则返回非空DIR指针 xff0c
  • 【Mybatis】No enum constant org.apache.ibatis.type.JdbcType.LONG

    问题描述 xff1a 今天编写定时任务管理模块 xff0c 提交定时任务实体信息时 xff0c 提示如下错误 nested exception is org apache ibatis builder BuilderException Er
  • ego-planner论文阅读笔记

    ESDF Euclidean Signed Distance Field EGO ESDF free Gradient based lOcal planning framework 摘要 通过比较碰撞轨迹与无碰撞引导路径 xff0c 得到惩
  • 冒泡排序,选择排序,插入排序的比较

    冒泡排序与选择排序相比 xff0c 一个从局部入手减少逆序元素 xff0c 一个放眼大局逐个选择最小值 xff0c 二者思路大不相同 但是 xff0c 它们又都有着 通过i次外层循环 xff0c 从数据中顺次求出i个最小值 的相同特征 相对
  • 【操作系统】2.3 进程同步与互斥

    这一节大概是操作系统中最难的一节了 2 3 1 进程的同步与互斥 2 3 1 进程的同步与互斥 StudyWinter的博客 CSDN博客 进程同步思维导图 进程同步 xff1a 在多道程序环境下 xff0c 进程是并发执行的 xff0c
  • 【算法】递增子序列

    总结一下三道求子序列长度的题 1 最长递增子序列 300 最长递增子序列 给你一个整数数组 nums xff0c 找到其中最长严格递增子序列的长度 子序列 是由数组派生而来的序列 xff0c 删除 xff08 或不删除 xff09 数组中的
  • 【算法】单调栈的题

    记一次笔试题 描述 给定一个长度为 nn 的可能含有重复值的数组 numsnums xff0c 找到每一个位置 ii 左边最近的位置 ll 和右边最近的位置 rr xff0c nums lnumsl 和 nums rnumsr 比 nums
  • Skip List--跳表(全网最详细的跳表文章没有之一)

    笔者目前是CPP方向 xff0c 今年 xff08 2023届 xff09 秋招时在简历中写的就是跳表的项目 xff0c 当时是啃源码啃下的 xff0c 把跳表整体的思路是理顺了 但是在面试过程中 xff0c 有不少面试官都对这个项目很感兴
  • 报错:Caused by: org.xml.sax.SAXParseException

    Caused by org xml sax SAXParseException 文档根元素 34 project 34 必须匹配 DOCTYPE 根 34 null 34 错误提示 xff1a gframework beans factor
  • 用malloc动态申请一个二维数组

    利用二级指针申请一个二维数组 define CRT SECURE NO WARNINGS include lt iostream gt include lt vector gt include lt algorithm gt using n
  • 有符号/无符号整数相加溢出的判断方法

    1 有符号数相加溢出判断 1 1 两个有符号的数是正数 当两个有符号整数x y同为正数 xff0c 且x 43 y的结果为非正时 xff0c 发生了正溢出 define CRT SECURE NO WARNINGS include lt i
  • 【算法】求最小子集的和被5整除

    昨天面试了一家公式 xff0c 面试上来问我 xff0c 使用过哪些STL容器 xff0c 我说了一下 xff0c 然后又问从最简单的开始说 面试官 xff1a 说说使用vector是需要注意什么 xff1f 我 xff1a 注意什么 迭代