寒武纪算法开发岗位二面手撕代码题目详细记录
寒武纪算法开发岗位二面手撕代码题目记录
题目:
给定一个数组,求能组成的和中,最小不可能的和。
例如:[1,2,3,5],最小不可能的和为12。
解答:
就是一个二维动态规划,下面的答案是我面试完下来自己又重新做的,当时没做出来。
主要就是一个二维dp table,然后dp[i][j]表示数组中前i个数,组成和为j是否可能出现。
填表规则:
data为所给数组。
dp[i][j] 有三个来源决定:
- 上一行当前列的值;
- 上一行从当前列往前推data[i],例如,这里第二行data[i]=2;则就是是看dp[i-1][j-data[i]]。
- 本身dp[i][j].
则得到状态转移方程为:
当data[i] > j时:
dp[i][j] = dp[i-1][j] || dp[i-1][j-data[i]] || dp[i][j]
当j >= data[i] 时:(仅仅考虑上一行当前列的数)
dp[i][j] = dp[i-1][j] || dp[i]
初始化:
列数由数组内所有数之和决定,cols = sum,创建数组的时候多留出一个0.所以第二维维sum+1.
行数就是数组的长度。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
5 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
填表:填写第二行
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
5 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
填表:填写第二行
这里你可能会疑惑,第三行第6列这里为什么会填1呢?它是由第2行第(6-3)列得来的。
!!注意这里由于是看当前行之前的数,所以不会出现两个相同数相加的情况,比如第2行第3列,这个3是由1+2得到的,而不是直接是3.
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
---|---|---|---|---|---|---|---|---|---|---|---|
2 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
5 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
填表:填写第三行
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
代码:
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;/*
该代码是寒武纪的二面面试题:
题目:
给定一个数组,求能组成的和中,最小不可能的和。
例如:[1,2,3,5],最小不可能的和为12。
*/int minNoSum(vector<int>& data) {int n = data.size();if (n == 0) return 0;if (n == 1) return 1;int minv = INT_MAX;int sum = 0;sort(data.begin(), data.end());for (int i = 0; i < n; ++i) {if (data[i] < minv) minv = data[i];sum += data[i];}// dp[i][j]表示前i个数,和为j是否能取到vector<vector<bool>> dp(n, vector<bool>(sum+1, 0));for (int i = 0; i < n; ++i) {int num = data[i];dp[i][num] = 1;}for (int i = 1; i < n; ++i) {for (int j = 1; j <= sum; ++j) {if (j >= data[i]) {dp[i][j] = dp[i-1][j] || dp[i-1][j-data[i]] || dp[i][j];}else {dp[i][j] = dp[i - 1][j] || dp[i][j];}}}for (int i = 1; i < sum; ++i) {if (!dp[n - 1][i]) return i;}return sum + 1;
}int main()
{vector<int> data = {1,2,3,5};int res = minNoSum(data);cout << res << endl;system("pause");return 0;
}
寒武纪算法开发岗位二面手撕代码题目详细记录相关推荐
- 2021年oppo哲库数字IC岗位手撕代码真题(含:握手信号、自动售卖机、序列发生器、根据RTL写verilog)
大家好,最近汇总了2021年oppo哲库招聘手撕代码题目,本文章一共含有以下几个题目: 一,使用握手信号实现跨时钟域数据传输(verilog) 二,自动售卖机(verilog) 三,序列发生器(ver ...
- 2023华为OD面试手撕代码经验分享
我们先来看下这个同学的面试经历吧,非常有借鉴的意义. [22届考研渣渣的od求职之旅,推荐一下两个人,德科hr和牛客的老哥] "*********",hr给了机会吧,一开始我都没想 ...
- 【数字IC手撕代码】Verilog固定优先级仲裁器|题目|原理|设计|仿真
芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...
- 【数字IC手撕代码】Verilog奇数分频|题目|原理|设计|仿真(三分频,五分频,奇数分频及特殊占空比)
芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...
- 【数字IC手撕代码】Verilog偶数分频|题目|原理|设计|仿真(二分频,四分频,六分频,八分频,偶数分频及特殊占空比)
芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...
- 【数字IC手撕代码】Verilog自动售卖饮料机|题目|原理|设计|仿真
芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...
- 【数字IC手撕代码】Verilog半整数分频|题目|原理|设计|仿真
芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...
- Interview:算法岗位面试—11.06早上上海某智能驾驶科技公司(创业)笔试+面试之手撕代码、项目考察、比赛考察、图像算法的考察等
Interview:算法岗位面试-11.06早上上海某智能驾驶科技公司(创业)笔试+面试之手撕代码.项目考察.比赛考察.图像算法的考察等 导读:该公司是在同济某次大型招聘会上投的,当时和HR聊了半个多 ...
- 算法手撕代码46~50
深度学习/机器视觉/数字IC/FPGA/算法手撕代码目录总汇 目录 1.二叉搜索树的第k个节点 2.两个栈实现队列 3.青蛙跳台阶
最新文章
- identifier of an instance of was altered from to n
- MobIM仅为开发者提供即时通讯的消息通道服务
- mpvue 从零开始 女友的来电 4 flyio
- tomcat原理解析(一):一个简单的实现
- LeetCode 1742. 盒子中小球的最大数量
- 嵌入式基础(1)---硬件知识,搞嵌入式开发必备
- [转]setTimeout() 函数未定义错误
- python 以行为单位进行字符串的切割
- 读取jar中资源文件的问题
- 药品计算机培训计划,_计算机培训学习计划范文
- 提高自己社会竞争力的书籍
- yapi接口管理工具
- 洛谷 【入门1】顺序结构 P5708 【深基2.习2】三角形面积
- 说说在JAVA中使用Redis,以及Redis分布锁
- 计算机加减乘除的公式,Word表格函数公式,轻松搞定加减乘除
- JS逆向基础知识个人总结
- 为什么博图中放置按下按钮无反应_为什么点击了没反应,每个按钮都是
- 信奥中的数学 组合篇 相关资料汇总(2022.07.08)
- R语言机器学习之caret包详解(一)
- 不同种类的单片机通讯分析
热门文章
- Python实现三维高斯函数图像显示
- 水壶 - NOI Online 3
- 结构体占用内存的计算
- 企业为什么要做高新认证?国家高新技术企业认定的6大好处!
- arcgis engine中的“System.Runtime.InteropServices.COMException”类型的第一次机会异常在...发生
- 艾永亮:把“卖酱油”做到极致,海天味业到底是怎么做到的?
- php网站分站功能,使用Wordpress的多站点功能、设置分站 | 某某人的记事本
- 陈海波:道里可信结构在云计算服务隐私安全保障方面的应用
- 换算一下 - 技术服务支持
- java断点_Java 断点调试总结