秋招突击——6/24——复习{完全背包问题——买书,状态转换机——股票买卖V}——新作{两数相除,LRU缓存实现}

文章目录

    • 引言
    • 复习
      • 完全背包问题——买书
        • 个人实现
      • 状态转换机——股票买卖V
        • 个人实现
        • 参考实现
    • 新作
      • 两数相除
        • 个人实现
      • 新作LRU缓存实现
        • 个人实现
          • unordered_map相关
          • priority_queue相关
        • 参考实现
        • 自己复现
    • 总结

引言

  • 今天知道拼多多挂掉了,难受,那实习就是颗粒无收了。整的我有点失神,难受,可能后面的日子不好过吧,没什么钱了,然后奖学金评定不一定能够评上!

  • 后续好好准备秋招吧,实习暂时算是告一段落了,也不再去想了,加油吧!

  • 其实本来主管面就面的不好,我不应该在报什么希望,怀疑会出现像二面一样的情况,觉得免得不好,但是最终给你过了,不可能的!那种毕竟是少数吧!兄弟,加加油吧!我尽力就好了!不要再难过了!

  • 不要总是心存侥幸 ,还是得脚踏实地,尽可能完成自己的计划。

复习

完全背包问题——买书

  • 上一次分析链接
  • 二维背包问题
  • 第一次讲买药的背包问题

思路分析

  • 这里暂时没有理解那个转换公式,还是使用传统的分析方式再写一遍!
个人实现
#include <iostream>using namespace std;const int N = 1010,M = 5;
int p[M] = {0,10,20,50,100};
int n,f[5][N];int main(){cin>>n;f[0][0] = 1;for (int i = 1; i <= 4; ++i) {for (int j = 0; j <= n; ++j) {for (int k = 0; k * p[i] <= n; k ++) {f[i][j] +=f[i - 1][j - k * p[i]];}}}cout<<f[4][n];
}

状态转换机——股票买卖V

状态机模型已经做过几道题目了,具体链接如下

  • 状态机——股票买卖
  • 之前还做过大盗阿福,但是没有了,不过无所谓。
  • 上一次的思路分析
个人实现
  • 状态转换机的关键是确定有哪几种状态,然后确定状态转移方程,也就是确定了动态规划的方程,最终确定最终的结果。

  • 这道题和之前的题目,有不同,没有了限定股票交易次数,所以需要重新考虑一下

  • 这里去除了一个维度,但是有一个问题,这个冷冻期应该怎么处理,感觉像我下面这样处理有问题。然后这里有多重情况,应该怎么计算?先试试看吧,先这样写吧,冷冻期不能执行任何操作!

在这里插入图片描述
这里有一个问题,如果某一个状态选中了对应的值,那么上一个状态就会影响下一个状态,这就不满足动态规划的基本要求了!

  • 暂时只能写成这样了,关于冷冻状态还不知道怎么处理!
#include <iostream>
#include <cstring>
using namespace std;const int N = 10010,D = -1;//定义D状态表示冷冻状态
int f[N][2];  // 0表示没有持有股票,1表示持有了股票
int w[N],n;int main(){cin>>n;for (int i = 1; i <= n + 1; ++i) {cin>>w[i];}// 向后进行遍历memset(f, size(f),INT_MIN);for (int i = 1; i <= n + 1; ++i) {f[i][0] = max(f[i - 1][0],f[i - 1][1] - w[i]);f[i][1] = max(f[i - 1][1],f[i - 1][0] + w[i]);}// 返回最终结果cout<<f[n + 1][0];
}
参考实现
  • 条件是否满足,是自动判断的,然后自动转移的。

在这里插入图片描述

  • 这里的思路和我分析的差不多,但是我缺了两部,一个是确定状态机的出口,还有就是状态机的入口。
  • 这里根据这个再重写一下哈,还是自己的想法不够理智,没有自信。根源在于对立理论的未知,始终觉得不够!
#include <iostream>
#include <cstring>
#include <limits.h>
using namespace std;const int N = 100010;//定义D状态表示冷冻状态
int f[N][3];  // 0表示没有持有股票,1表示持有了股票
int w[N],n;int main(){cin>>n;for (int i = 1; i <= n; ++i) {cin>>w[i];}// 向后进行遍历
//    memset(f, INT_MIN,size(f));f[0][0] = f[0][1] = INT_MIN;f[0][2] = 0;// 定义入口状态for (int i = 1; i <= n; ++i) {f[i][0] = max(f[i - 1][0],f[i - 1][2] - w[i]);f[i][1] = f[i - 1][0] +w[i];f[i][2] = max(f[i - 1][1],f[i - 1][2]);}// 返回最终结果cout<<max(f[n][1],f[n][2]);return 0;
}

新作

两数相除

  • 题目链接
个人实现
  • 有以下几个考虑到东西
    • 原来的数据是int类型的,但是INT_MIN的绝对值是比INT_MAX大一的,所以要使用long long进行存储,防止溢出。
    • 使用移位运算的增加运算效率,进而增加运算效率
    • 保存不同倍数的样本,然后直接比较大小。
#include <iostream>
#include <limits.h>
#include <vector>
using namespace std;int divide(int x ,int y){// x / ytypedef long long LL;vector<LL> exp;LL a = abs((LL)x),b = abs((LL)y),res = 0;for (LL i = b; i <= a; b += b) exp.push_back(i);// 判定符号int is_minus = 1;if ((x < 0 && y > 0) || (x > 0 && y < 0)) is_minus = -1;// 然后从大到小进行遍历,保证结果的相似性for (int i = exp.size() - 1; i >= 0 ;i --) {if (a >= exp[i]) {a -= exp[i];res += 1ll << i;}}if (res >= INT_MAX) return INT_MAX; if (res <= INT_MIN) return INT_MIN;if (is_minus == -1) return 0 - res;return res;
}int main(){cout<<divide(10,3);
}
  • 写的还是蛮快的,基本思路都是对的,然后忘记了取绝对值,还有就是移位运算使用了i,不是使用1进行移位运算的。

新作LRU缓存实现

  • 题目链接
  • 这道题是今天的面试题,难顶,我居然没有写出来,等会得好好再写一遍,有很多方法都没有写出来。
个人实现
  • 这道题我就不卡时间了,在面试中,这道题我没有想出来,但是就算按照我的方法,还有很多东西,我自己都实现不了,这里实现以下我的方法。或者说,将我的东西进行查漏补缺一下,还是有很多东西不会。

    • 感觉这里要实现双向链表和Hashtable的结合体,通过hashtable来实现get和put函数的O(1)访问,通过双向链表来实现对应的最近最久未访问的优先级。
  • 下面这两个方法得好好背背,使劲背背,不然太难受了!

unordered_map相关

count方法相关

map.count(key)
  • 1表示元素存在
  • 0表示元素不存在

删除元素
map.erase(key) //直接删除对应的元素

#include <iostream>
#include <unordered_map>
using namespace std;int main(){unordered_map<int,int> s;// 添加元素s[1] = 1;s[2] = 1;s[3] = 1;s[4] = 1;// 获取map的元素个数cout<<s.size()<<endl;// 删除特定的元素s.erase(1);for (auto i : s) {cout<<i.first<< "  " <<i.second<<endl;}// 访问特定的元素cout<<s[3]<<endl;cout<<s[6]<<endl;  // 访问不存在的元素,默认会返回为零// count方法测试// 元素不存在就返回0,元素存在就返回1cout<<"元素存在:"<<s.count(3)<<endl;cout<<"元素不存在:"<<s.count(16)<<endl;}

在这里插入图片描述

priority_queue相关

声明一个自定义排序函数的优先队列

  • 这个声明自定义一个比较函数的方法,写法比较特殊,所以需要的好好背一下,认真记录一下哎。
#include <iostream>
#include <queue>
using namespace std;// 使用结构体声明
struct CustomCompare{
// 两个括号bool operator()(const int& lhs, const int& rhs) const{return lhs > rhs;}
};int main(){// 指定中间体,以及对应的比较函数的priority_queue<int ,vector<int> ,CustomCompare> s;s.push(6);s.push(2);s.push(3);while(!s.empty()){cout<<s.top()<<endl;s.pop();}
}
  • 其他的就跟队列差不多,所以这里需要好好记录一下哎!!
参考实现
  • 修改每一个key-value的时间戳,然后能够一瞬间找到最小的元素===》使用双链表实现
    • 使用双链表进行排序,实现这种方式。
  • 整体的实现方式和我的想的差不多,还是要重视一下怎么实现。
  • 下面贴一下y总的代码实现思路。
class LRUCache {
public:struct Node {int key, val;Node *left, *right;Node(int _key, int _val): key(_key), val(_val), left(NULL), right(NULL) {}}*L, *R;unordered_map<int, Node*> hash;int n;void remove(Node* p) {p->right->left = p->left;p->left->right = p->right;}void insert(Node* p) {p->right = L->right;p->left = L;L->right->left = p;L->right = p;}LRUCache(int capacity) {n = capacity;L = new Node(-1, -1), R = new Node(-1, -1);L->right = R, R->left = L;}int get(int key) {if (hash.count(key) == 0) return -1;auto p = hash[key];remove(p);insert(p);return p->val;}void put(int key, int value) {if (hash.count(key)) {auto p = hash[key];p->val = value;remove(p);insert(p);} else {if (hash.size() == n) {auto p = R->left;remove(p);hash.erase(p->key);delete p;}auto p = new Node(key, value);hash[key] = p;insert(p);}}
};/*** Your LRUCache object will be instantiated and called as such:* LRUCache* obj = new LRUCache(capacity);* int param_1 = obj->get(key);* obj->put(key,value);*/

作者:yxc
链接:https://www.acwing.com/activity/content/code/content/405014/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

自己复现
  • 时间太晚了,大概思路整对了就行了,明天抽空再做一下,这里给一个半吊子的。
#include <iostream>
#include <queue>
#include <unordered_map>
using namespace std;class LRUCache {
public:struct Node{int key,value;Node* l;Node* r;Node():key(-1),value(-1),l(nullptr),r(nullptr){};Node(int k,int v):key(k),value(v),l(nullptr),r(nullptr){};}*L,*R;  // 定义两个伪端点int n;unordered_map<int ,Node* > s;LRUCache(int capacity) {n = capacity;L = new Node();R = new Node();L->l = R;R->r = L;}void remove(Node* t){// 删除非两端端点的插入方法,这里删除特定的元素}void insert(Node* t){// 直接在最末尾段插入元素}int get(int key) {// 查看元素是否存在if(s.count(key) == 1){// 元素存在,返回对应的值int res = s[key]->value;remove(s[key]);insert(s[key]);return res;}else{// 元素不存在的话,直接返回-1return -1;}}void put(int key, int value) {// 判定元素的是否存在,if (s.count(key) == 1){s[key]->value = value;remove(s[key]);insert(s[key]);}else{// 元素不存在,直接加入// 判定是否爆表auto p = new Node(key,value);if (s.size() >= n){s.erase(L->r->key);  //删除元素并添加的s[key] = p;// 插入对应的元素}}}
};int main(){}

总结

  • 其实之前的面试已经体现出我有一个很大的问题了,就是不会的语言的基础特性,无论是java还是C++,都是没背过,今天的面试应该也是要凉的,因为很多基础的特性都不会,没有了解过。这里只是知道怎么用,但是还远远不够,所以需要好好背一下!后面这部分东西,要抓紧了解!
  • pdd,我永远的痛呀,秋招应该不会去的,因为有竞业协议,进去了毕竟职业生涯就终结了。不想了,继续看吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/365456.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

体验升级:扫描全能王智能高清滤镜2.0全面测评

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【接口自动化测试】第四节.实现项目核心业务的单接口自动化测试

文章目录 前言一、登录单接口自动化测试 1.1 登录单接口文档信息 1.2 登录成功 1.3 登录失败&#xff08;用户名为空&#xff09;二、数据驱动的实现 2.1 json文件实现数据驱动总结 前言 一、登录单接口自动化测试 1.1 登录单接口文档信息 需求&#xff1…

LeetCode 子集

原题链接78. 子集 - 力扣&#xff08;LeetCode&#xff09; 这是一道暴力搜索问题参考大佬们的题解&#xff0c;对这类题目做出一下总结 1.确定递归参数变量 2.递归结束条件 3.做出选择&#xff0c;递归调用进入下一层 4.回溯&#xff0c;返回到递归前的状态 要完成前面这…

【Matlab函数分析】imread从图形文件读取图像

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

Qt6.6编译Qt二维图形编辑器QVGE源码

QVGE是一个开源的多平台QtC编写的图形编辑器&#xff0c;可以用来画网络节点图&#xff0c;或者其他作用。 QVGE可以轻松创建和参数设定的小型到中型图形(1000节点/边缘)&#xff0c;共同的视觉特性的节点和边缘&#xff1a;形状、尺寸、颜色、标签等。定义(用户定义)属性的图表…

前端技术(二)——javasctipt 介绍

一、javascript基础 1. javascript简介 ⑴ javascript的起源 ⑵ javascript 简史 ⑶ javascript发展的时间线 ⑷ javascript的实现 ⑸ js第一个代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>…

探究Qt5【元对象编译器,moc】的 设计原理和技术细节

Qt5是一个跨平台C框架&#xff0c;它有个突出的特点就是其元对象系统&#xff0c;该系统通过扩展C的能力&#xff0c;为事件处理提供了信号与槽机制、为对象内省提供了属性系统。为了支持这些特性&#xff0c;Qt引入了元对象编译器&#xff08;Meta-Object Compiler, MOC&#…

C++视觉开发 一.OpenCV环境配置

一.OpenCV安装环境配置 1.OpenCV安装 &#xff08;1&#xff09;下载 官方下载链接&#xff1a;http://opencv.org/releases 这边选择需要的版本&#xff0c;我是在windows下的4.9.0。&#xff08;科学上网下载很快&#xff0c;否则可能会有点慢&#xff09; (2)安装 双击下…

使用systemd管理Linux下的frps服务:安装、配置及自动化操作指南

在 Linux 系统下&#xff0c;使用 systemd 可以方便地控制 frps 服务端的启动、停止、配置后台运行以及开机自启动。以下是具体的操作步骤&#xff1a; 1. 安装 systemd 如果您的 Linux 服务器上尚未安装 systemd&#xff0c;可以使用包管理器如 yum&#xff08;适用于 Cent…

基于RabbitMQ的异步消息传递:发送与消费

引言 RabbitMQ是一个流行的开源消息代理&#xff0c;用于在分布式系统中实现异步消息传递。它基于Erlang语言编写&#xff0c;具有高可用性和可伸缩性。在本文中&#xff0c;我们将探讨如何在Python中使用RabbitMQ进行消息发送和消费。 安装RabbitMQ 在 Ubuntu 上安装 Rabbi…

GaussDB关键技术原理:高性能(三)

GaussDB关键技术原理&#xff1a;高性能&#xff08;二&#xff09;从查询处理综述对GaussDB的高性能技术进行了解读&#xff0c;本篇将从查询重写RBO、物理优化CBO、分布式优化器、布式执行框架、轻量全局事务管理GTM-lite等五方面对高性能关键技术进行分享。 目录 3 高性能…

PyTorch之nn.Module、nn.Sequential、nn.ModuleList使用详解

文章目录 1. nn.Module1.1 基本使用1.2 常用函数1.2.1 核心函数1.2.2 查看函数1.2.3 设置函数1.2.4 注册函数1.2.5 转换函数1.2.6 加载函数 2. nn.Sequential()2.1 基本定义2.2 Sequential类不同的实现2.3 nn.Sequential()的本质作用 3. nn.ModuleList参考资料 本篇文章主要介绍…

AI绘画-Stable Diffusion 原理介绍及使用

引言 好像很多朋友对AI绘图有兴趣&#xff0c;AI绘画背后&#xff0c;依旧是大模型的训练。但绘图类AI对计算机显卡有较高要求。建议先了解基本原理及如何使用&#xff0c;在看看如何实现自己垂直行业的绘图AI逻辑。或者作为使用者&#xff0c;调用已有的server接口。 首先需…

Open3D (C++) 点云旋转至主成分空间

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 首先使用主成分分析法计算出点云的特征值与特征向量,然后根据点云的特征向量计算出点云与主成分空间之间的…

CAM350怎么添加文字?

CAM350怎么添加文字&#xff1f; CAM350只能修改用CAM350本身做的文字&#xff0c;其它软件生成的GERBER文件导入到CAM350会默认为线条&#xff0c;没办法修改。 如果想添加文字&#xff0c;先把原先的文字删除。然后在CAM350里面重新添加文字就可以了。 操作方法如下&#xf…

Java代码生成器(开源版本)

一、在线地址 Java在线代码生成器&#xff1a;在线访问 二、页面截图 三、核心功能 支持Mybatis、MybatisPlus、Jpa代码生成使用 antlr4 解析SQL语句&#xff0c;保证了SQL解析的成功率支持自定义包名、作者名信息支持自定义方法名、接口地址支持自定义选择是否生成某个方法…

力扣 单链表元素删除解析及高频面试题

目录 删除元素的万能方法 构造虚拟头结点来应对删除链表头结点的情况 一、203.移除链表元素 题目 题解 二、19.删除链表中倒数第K个节点 题目 题解 三、 83.删除某个升序链表中的重复元素&#xff0c;使重复的元素都只出现一次 题目 题解 82.删除某个升序链表中的…

mongodb在windows环境安装部署

一、mongodb 1.释义 MongoDB 是一种开源的文档型 NoSQL 数据库管理系统&#xff0c;使用 C 编写&#xff0c;旨在实现高性能、高可靠性和易扩展性。MongoDB 采用了面向文档的数据模型&#xff0c;数据以 JSON 风格的 BSON&#xff08;Binary JSON&#xff09;文档存储&#x…

第一周:李宏毅机器学习笔记

第一周学习周报 摘要一、机器学习基础理论1. 什么是机器学习&#xff1f;2. 机器学习“寻找”的函数有哪些类型&#xff1f;3. 机器学习中机器如何“寻找”函数&#xff1f;三步走3.1 第一步&#xff1a;设定函数的未知量&#xff08;Function with Unknown Parameters&#xf…

SpringMvc 执行原理

当用户请求 会发送到前端控制器&#xff0c;DisptcherServlet根据请求参数生成代理请求&#xff0c;找到对应的实际控制器&#xff0c;控制器处理请求&#xff0c;创建数据模型&#xff0c;访问数据库&#xff0c;将模型响应给中心控制器&#xff0c;控制器使用模型与视图渲染视…