0826-0901 各种面试笔试题算法题整理

news2024/11/13 9:43:22

目录

1. 最长回文子串

2. 设计模式里和单一职责原则冲突的是?

3. int array[] = {10,20,30} cout<<-2[array-1] 是多少

4. python 定义 @class method 直接对类修改变量值和建立对象后通过对象修改变量值,最后的结果是多少

5. LRU缓存

6. 二叉树的最近公共祖先

7. transformer如何做位置编码

8.  搜索旋转排序数组

9. 二叉树的右视图

10. 前k个高频元素


1. 最长回文子串

从一个字符串里找到最长的回文子串 子串表示连续

用动态规划来做,dp数组表示:

dp[i,j] = dp[i+1,j-1] || str[i]=str[j] 只有当i+1到j-1  为回文串且i和j相等时,i到j是回文

初始化:

子串长度为1:一定是回文;子串长度为2:当两个相等时为回文

我自己想的做法,就是构建上三角形,循环顺序不是逐行逐列,而是从最长的对角线往右上角走,这样每个dp回溯上一个的时候上一个的值都取好了。

string longestPalindrome(string s) {
        int m = s.size();
        vector<vector<int>> dp(m,vector<int>(m,0));

        int maxi=0,maxj=0,maxval=0;
        for(int x = 0;x<m;x++){
            for(int i =0;i<m;i++){
                int j = i+x;
                if(i+x < m){
                    if(i==j){
                        dp[i][j] = 1;
                    }else if(j-i == 1){
                        if(s[i] == s[j]) dp[i][j] = 1;
                    }else{
                        if(s[i] == s[j])
                            dp[i][j] = dp[i+1][j-1];
                    }
                    if(dp[i][j] == 1 && j-i+1 >maxval){
                        maxval = j-i+1;
                        maxj = j;
                        maxi = i;
                    }
                }
            }
        }
       
        return s.substr(maxi,maxval);
    }

2. 设计模式里和单一职责原则冲突的是?

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

单例模式定义:确保一个类最多只有一个实例,并提供一个全局访问点

单一职责原则指的是一个类只有一个引起他变化的原因。

开闭原则指的是类、函数等是可以扩展的,但是不能修改。

3. int array[] = {10,20,30} cout<<-2[array-1] 是多少

-2[array-1] 是 -(&array -1)[2]

4. python 定义 @class method 直接对类修改变量值和建立对象后通过对象修改变量值,最后的结果是多少

@classmethod 定义类方法,这样的方法可以在不创建类的实例的情况下直接调用。

5. LRU缓存

好麻烦,这个连模板都不好抄,太复杂了,只能现做了

做法就是,建立一个unorderedmap存key到node,一个双向链表存node的顺序

每次根据key放一个数,就是在双向链表找到这个数的值,并且把这个node放在链表头,如果没找到,就新建一个放到链表头,如果链表大小超过容量就把队尾删除

每次取一个数,就判断key在不在,不在就返回-1

struct DLinkedNode {
    DLinkedNode  * prev, * next;
    int key, value;
    DLinkedNode ():key(0),value(0), prev(nullptr),next(nullptr){};
    DLinkedNode (int k,int v):key(k),value(v), prev(nullptr),next(nullptr){};
};
class LRUCache {
public:
    unordered_map<int, DLinkedNode  *> cache;
    DLinkedNode  * head, * tail;
    int size; //当前存储的大小
    int capacity; // 总容量
    LRUCache(int _capacity) {
        capacity = _capacity;
        size = 0;
        // 创建空的头尾指针,并且连起来
        head = new DLinkedNode ();
        tail = new DLinkedNode ();
        head->next = tail;
        tail->prev = head;
    }
    
    int get(int key) {
        if(!cache.count(key)){
            return -1;
        }
        // 如何key存在,就把key指向的双向链表指针移动到链表的头
        DLinkedNode  * node = cache[key];
        moveToHead(node);
        return node->value;
    }
    
    void put(int key, int value) {
        if(!cache.count(key)){
            // key不存在,就创建一个新的
            DLinkedNode  * node = new DLinkedNode  (key,value);
            cache[key] = node;
            addToHead(node);
            size++;
            if(size>capacity){
                // 删除尾部节点
                DLinkedNode  * removed = removeTail();
                cache.erase(removed->key);
                delete removed;
                --size;
            }

        }else{
            DLinkedNode  * node = cache[key];
            node->value = value;
            moveToHead(node);
        }
    }
    void removeNode(DLinkedNode  * node){
        node->prev->next = node->next;
        node->next->prev = node->prev;
    }
    void addToHead(DLinkedNode  * node){
        // node插入到head的后面
        node->prev = head;
        node->next = head->next;
        head->next->prev = node;
        head->next = node;
    }
    void moveToHead(DLinkedNode  * node){
        removeNode(node);
        addToHead(node);
    }
    DLinkedNode * removeTail(){
        DLinkedNode * node = tail->prev;
        removeNode(node);
        return node;
    }
};

6. 二叉树的最近公共祖先

一个点是p和q的最近公共祖先,则这个点满足:

(1)左子树包含p,右子树包含q

或者(2)自己本身是p,左子树或者右子树包含q,反之

这题有必要再做一遍,完全看题解的思路写的,回溯

回溯不会写,关键在于return的是什么!这里return的是:root是否包含p,q任意一个节点,只要左右节点都满足包含,就说明它一定是公共节点!(因为不可能左右节点都包含p或者都包含q,所以包含就说明一定是一个包含p,一个包含q)

class Solution {
public:
    // dfs判断cur是否包含p,q中任意一个节点
    TreeNode * ans;
    bool dfs(TreeNode* cur,TreeNode* p, TreeNode* q) {
        if(cur == nullptr) return false;
        bool lres = dfs(cur->left,p,q);
        bool rres = dfs(cur->right,p,q);
        if(lres && rres){
            ans = cur;
        }else if((lres && (cur->val == p->val)) || (lres && (cur->val == q->val))){
            ans = cur;
        }else if((rres && (cur->val == p->val)) || (rres && (cur->val == q->val))){
            ans = cur;
        }
        return lres || rres || cur->val == p->val || cur->val == q->val;
        
    }       
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        dfs(root,p,q);
        return ans;
    }
};

7. transformer如何做位置编码

还有其他网络模型,在输入的时候也有必要做位置编码,比如把化学式的位置信息编码进去?

因为transformer没有明确的关于源句子中位置的相对和绝对的信息,是把一个句子一起输入进去的,所以用位置编码技术给每个单词额外添加一个编码表示它在序列中的位置

假设整个句子的长度为1,那么其中某两个单词的距离为0.5。但是如果句子变长,那么相对的单词之间的距离也会变长,但这不合适,所以位置编码应该是让不同长度的句子之间,两个词之间的差值保持一致,但是编码值也要在一个范围内。

编码方式有三种:

(1)Learned Positional Embedding编码绝对位置

直接对不同的位置随机初始化一个postion embedding,加到word embedding上输入模型,作为参数进行训练。

bert的输入有三个:

token embeddings:就是对单词内容进行embedding, 

segment embeddings:标识这个单词的segment,属于哪一段

position embeddings:标识这个单词的位置,从0到1,2,3.。。

这些都是先得到一个数字,再embedding的,不是直接把数字加上去的

(2)相对位置编码

使用正余弦函数得到绝对位置,通过两者乘积得到相对位置。

这样设计的好处是位置pos+k的positional encoding可以被位置pos线性表示,反应其相对位置关系。周期函数也就是用来考虑相对位置的。

input = input_embedding + positional_encoding

8.  搜索旋转排序数组

我是傻子,我想出来的做法是先找到分割点,再前后做二分

但实际上找分割点的操作复杂度就On了,那还二分什么啊,不如直接搜索一个数啊

但是题解的做法我也没看懂,用了另一个做法:先找到旋转数组的最小值(用二分法找),也就是分割点,然后再对左右做二分,那样复杂度就是3O(logn),应该可以

找最小值刚好是另一道题:旋转数组的最小值

做法就是,判断mid和right的关系,如果nums[mid]>nums[right],说明最小值在mid右边,否则就在左边

这里判断最小值是逼近法,二分到只剩一个区间了,那他就是最小值。

class Solution {
public:
    int findmin(vector<int>& nums,int left, int right){
        int mid = (left + right) / 2;
        if(left == right) return mid;
        if(nums[mid] > nums[right]){
            return findmin(nums,mid+1, right);
        }else{
            return findmin(nums,left,mid);
        }
    }
    int bsearch(vector<int>& nums, int left, int right,int target){
        if(left > right) return -1;
        int mid = int((left+right)/2);
        if(nums[mid] == target){
            return mid;
        }else if (nums[mid] > target){
            return bsearch(nums,left,mid-1,target);
        }else{
            return bsearch(nums,mid+1,right,target);
        }
    }
    int search(vector<int>& nums, int target) {
        int idx = findmin(nums,0,nums.size()-1);
        int res = bsearch(nums,0,idx-1,target);
        if(res == -1)
            return bsearch(nums, idx,nums.size()-1,target);
        else return res;
        
    }
};

9. 二叉树的右视图

层序遍历 每次可以根据当前队列的长度知道该层的数量,输出最后一个就行了

    vector<int> rightSideView(TreeNode* root) {
        vector<int> res;
        deque<TreeNode *> que;
        if (root == nullptr) return res;
        que.push_back(root);
        while(!que.empty()){
            int layer_len = que.size();
            for(int i =0;i<layer_len;i++){
                TreeNode* cur = que.front();
                que.pop_front();
                if(cur->left != nullptr) que.push_back(cur->left);
                if(cur->right != nullptr) que.push_back(cur->right);
                if(i == layer_len-1) res.push_back(cur->val);
            }

        }
        return res;
    }

10. 前k个高频元素

面试会惩罚每一个没好好复习的人。。之前大根堆没搞懂糊弄过去了,这题总觉得用优先队列过于简单但也糊弄过去了

一到面试就完蛋

首先,用优先队列是基于小根堆!而不是大根堆!

创建一个k大小的小根堆,遍历数组中每一个元素,如果堆的大小=k且这个元素比堆顶元素大,就会替换堆顶元素(相当于把最小的放在最上面用来淘汰)这样的时间复杂度是O(nlogk)

我一直以为是用大根堆,把所有数组里的数都存进去,然后弹出前k个,这样复杂度是nlogn!就不对,nlogn是排序的复杂度啊

    int findKthLargest(vector<int>& nums, int k) {
        priority_queue<int, vector<int>, greater<int>> minheap;

        for(int num : nums){
            if(minheap.size() < k){
                minheap.push(num);
            }else if( num > minheap.top()){
                minheap.pop();
                minheap.push(num);
            }
        }
        return minheap.top();
    }

第二种做法是用快排的思路。每次迭代让左边的数小于它,右边的数大于它。

30. 分页存储

32. 分词器?有哪些 中英文 现在输入到神经网络里还需要用到分词器吗

33. Greedy Search贪婪搜索解码流程(用于机器翻译预测, transformer的预测过程)Transformer系列:Greedy Search贪婪搜索解码流程原理解析 - 简书

NLP实验3——基于Transformer的机器翻译_nlptransformer翻译-CSDN博客

34. Seq2Seq模型、GRU、RNN、LSTM在nlp上的 应用

35. bleu评价指标

36. 最大似然函数

37. 逻辑回归是什么?

42. LRU缓存,页面,判断是否hit。miss

43. struct占用的内存大小

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kafka【六】Linux下安装Kafka集群

Kafka从早期的消息传输系统转型为开源分布式事件流处理平台系统&#xff0c;所以很多核心组件&#xff0c;核心操作都是基于分布式多节点的。本文这里采用三台虚拟机模拟真实物理主机搭建Zookeeper集群和kafka集群。 VMware可以使用户在一台计算机上同时运行多个操作系统&…

继承(CPP)

引言 继承是CPP的一个重要语法。在现实生活中存在“子承父业”的说法&#xff0c;在CPP中同样存在这样的语法&#xff0c;而继承就是这种语法。 面向对象的三大特征&#xff1a;封装、继承、多态 本文将通过以下要素&#xff0c;进行继承的深入讲解 1.继承的概念及定义 2.基…

什么是网络准入控制系统?四款网络准入控制系统推荐 干货满满!

在当今的企业网络环境中&#xff0c;随着设备类型的多样化和远程办公的普及&#xff0c;网络安全面临的挑战愈加复杂。网络准入控制系统&#xff08;Network Access Control, NAC&#xff09;应运而生&#xff0c;成为企业保障网络安全的重要工具。本文就带你详细了解这一系统&…

4 款基于Python的鼠标键盘自动化工具,可解决Windows、macOS和Linux下的桌面自动化问题

在日常工作中&#xff0c;自动化工具可以极大地提升我们的工作效率&#xff0c;尤其是当面对重复性任务时。今天&#xff0c;我们将详细介绍四款基于Python的鼠标键盘自动化工具&#xff0c;帮助你在各种平台上轻松实现自动化操作。这些工具分别是 PyAutoGUI、KeymouseGo、Keyl…

《Nature》重磅发布:ChatGPT在学术研究和写作中的最佳应用指南

在论文写作过程中&#xff0c;ChatGPT 已成为许多研究人员的得力助手。知名生物医学教授 Milton Pividori 博士在《Nature》杂志上发表的文章《Chatbots in Science: What Can ChatGPT Do for You?》详细探讨了如何通过精心设计的提示词来有效利用 ChatGPT 提高学术写作的效率…

支付宝线上小程序打开异常

1. 其他手机都可以正常访问线上版本&#xff0c;只有一个安卓手机不行&#xff08;排除支付宝低版本以及手机系统问题&#xff09; 2. 出现访问异常的手机都可以正常访问体验版以及开发版本 3. 尝试去关闭该手机的联调设置以及清除开发版缓存&#xff0c;成功访问线上版本 需要…

如何彻底关闭Chrome浏览器自动更新

1.首先找到桌面 中Google Chrome浏览器的图片,鼠标右键打开文件所在的位置 2.选择Google 目录 选择 Update 目录 右键 选择属性 右键 选择属性 点击确定 修改成功 3.继续 第(2)步 选择 高级 4.点击禁用继承 !!!!!!! 测试 再次点击 Update 文件夹 弹出 你当前无权访问该文件夹…

一文1400字Jmeter实现mqtt协议压力测试

1. 下载jmeter&#xff0c;解压 https://jmeter.apache.org/download_jmeter.cgi 以 5.4.3 为例&#xff0c;下载地址&#xff1a; https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.4.3.zip linux下解压&#xff1a; unzip apache-jmeter-5.4.3.zip 2. 下载m…

如何在 Github 上找到心仪的开源项目?

Github&#xff0c;全球最大的开源社区&#xff0c;集中了目前最多、最优质的各种开源代码。 我们经常说不要重复造轮子&#xff0c;但如果不知道怎么找到已有的轮子&#xff0c;那就没有前提&#xff0c;对自己来说什么轮子都是新的。所以&#xff0c;搞开发&#xff0c;首先要…

Opencv中的直方图(5)计算EMD距离的函数EMD()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算两个加权点配置之间的“最小工作量”距离。 该函数计算地球搬运工距离&#xff08;Earth Mover’s Distance&#xff09;和/或两个加权点配…

微电网管理系统

微电网管理系统 1. 相关概念简介 基本概念及分析意义&#xff1a; 微电网基本概念&#xff1a;微电网&#xff08;MG&#xff09;由分布式电源、用电负荷、能量管理系统等组成&#xff0c;是一个能够基本实现内部电力电量平衡的供用电系统。 通过整合分布式电源、储能、负荷…

libusb在window下,使用vsstudio的初步安装与使用

下载&#xff1a; 首先&#xff0c;访问github官网 https://github.com/libusb/libusb/tree/master 然后&#xff0c;在版本选择里面&#xff0c;选择标签&#xff0c;点击最新的标签&#xff0c;&#xff08;这种一般稳定性最高&#xff09; 选择完后使用自己的方式下载下来…

双轨直销模式:团队互助与业绩倍增的商业策略

双轨直销模式因其操作简单、业绩压力较小、管理方便以及初期爆发力强等特点&#xff0c;受到许多直销公司的喜爱&#xff0c;并促进了多家大型企业的成长。 一、双轨直销模式简介 双轨直销是一种独特的组织架构&#xff0c;其核心在于每个销售代表仅需构建两个独立的销售线&a…

MiniMax 首个文生视频模型发布,可生成 6s,限时免费;阿里 Qwen2-VL 第二代视觉语言模型开源丨RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、…

第七在线携手美国男士内衣品牌Tommy John,共启智能订货新篇章

【喜讯速递】在数字化转型的浪潮中&#xff0c;7thonline第七在线再次以卓越的技术实力和前瞻性的市场洞察&#xff0c;成功签约国际知名男士内衣品牌Tommy John&#xff0c;双方将携手推进智能订货会计划&#xff0c;共同开启零售供应链管理的新纪元。 男士内衣品牌Tommy John…

智慧水利解决方案应该部署哪些设备(近距离走进智慧水利解决方案)

作为一名水利工程技术人员&#xff0c;我深知智慧水利解决方案对于现代水资源管理的重要性。在我多年的工作经验中&#xff0c;我见证了传统水利系统向智能化转变的过程&#xff0c;也深刻理解了部署正确的设备对于实现智慧水利的关键作用。今天&#xff0c;我想分享一下在智慧…

android AccessibilityService合法合规增加小红书曝光阅读量(2024-09-02)

免责任声明: 任何可操作性的内容与本人无关,文章内容仅供参考学习&#xff0c;如有侵权损害贵公司利益&#xff0c;请联系作者&#xff0c;会立刻马上进行删除。 一、分析 目前可增加曝光阅读流量渠道入口&#xff08;完成&#xff09; 1. 发现页 打开小红书app选择顶部发现页&…

Python和MATLAB(Java)及Arduino和Raspberry Pi(树莓派)点扩展函数导图

&#x1f3af;要点 反卷积显微镜图像算法微珠图像获取显微镜分辨率基于像素、小形状、高斯混合等全视野建模基于探测器像素经验建模荧光成像算法模型傅里叶方法计算矢量点扩展函数模型天文空间成像重建二维高斯拟合天体图像伽马射线能量和视场中心偏移角标量矢量模型盲解卷积和…

三、数组————相关概念详解

数组 前言一、数据理论基础二、数组常用操作2.1 初始化数组2.2 访问数组中的元素2.3 插入元素2.4 删除元素 三、数组扩展3.1 遍历数组3.2 数组扩容 总结1、数组的优点2、数组的不足 前言 在数据结构中&#xff0c;数组可以算得上最基本的数据结构。数组可以用于实现栈、队列、…

中资优配:炒股最笨十句口诀?

在出资股票时&#xff0c;出资者假设掌握一些方法技巧等&#xff0c;可以协助出资者更好地在股市进行生意&#xff0c;下面为我们介绍炒股十大口诀。 1、不跳水不买&#xff0c;不冲高不卖&#xff0c;横盘不生意 不要在股价跳水时急速买入&#xff0c;也不要在股价一开始冲高…