48天笔试强训——第23天

48 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 16 天,点击查看活动详情


选择题

image.png

显然时间复杂度为O(m*n)

image.png

对于链表来说,存储顺序和逻辑顺序是没有必要的联系的,因为每个节点都是动态的。那么对表中的数据进行插入和删除的时候也是不需要移动元素的。

image.png

ABD都是链表的优点就不用多说了。链表存储的空间不一定比线性表节省,因为它除了要存储数据外还有存储下一个节点的地址。

image.png

先把后面的节点处理好,然后再处理h节点。如图所示 image.png

image.png

针对c选项:第一个出队的是d,那么abc都已经进入队列中了,那么不可能第二个出队列的为b,出b之前必要出c。所以c选项错误。

image.png

度为0的节点个数比度为2的节点度数+1.

image.png

A:3号节点不平衡 B:7号节点不平衡 D:6号节点的存在导致该二叉树不是搜索二叉树

image.png

插入前 image.png 插入后 image.png

image.png

如果是查找的是发生冲突的数据,那么就不能在常数的时间内找到特定记录,最坏的情况是在O(N)的情况下查找到。由于数据量比较大的时候,就不可能把所有的记录存储在内存中,而要存储在磁盘中。哈希函数的选取和字段A还是有关的,字符串和数字就可以需要选择不同的函数。

image.png

很显然内存是直接对数据进行排序是不可能的,而归并排序可以借助磁盘是的空间进行排序。因为归并是把数据进行细分然后再归并的过程。小的数据量在内存中是可以进行排序的。

编程题

微信红包

先假设这个众数为就是第一个数,然后用一个变量记录众数的个数。 我们用众数抵消法:意思就是,从第2个数开始遍历,如果和假设的众数相等,个数就加1;反之就减1,当个数小于等于0的时候,说明假设的这个暂时不是众数,重新假设众数是现在正在遍历的这个数,直到遍历完。 最后对遍历完的那个众数进行验证,如果是众数,就返回,反之,返回0.

class Gift {
public:
    int getValue(vector<int> gifts, int n) {
        int ret=gifts[0];
        int count=1;
        for(int i=1;i<n;i++)
        {
            if(ret==gifts[i])
            count++;
            else
            {
                count--;
                if(count<=0)
                {
                    count=1;
                    ret=gifts[i];
                }
                
            }
        }
        count=0;
        for(auto x:gifts)
        if(x==ret)
        count++;
        if(count>n/2)
        return ret;
        else
        return 0;
    }
};

计算字符串的编辑距离

本题显然是一个动态规划的问题,我们用f[i][j]表示字符串str1在i位置与str2在j位置的的最小编辑距离。 那么f[i][j]怎么求呢?当str1[i]==str2[j]的时候f[i][j]=f[i-1][j-1],当str1[i]!=str2[j]的时候,f[i][j]=min(f[i-1][j-1],min(f[i][j-1],f[i-1][j])+1)

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

int LD(string& str1,string& str2)
{
    vector<vector<int>> f(1001,vector<int>(1001,0));
    for(int i=0;i<=str1.size();i++)
    {
        f[i][0]=i;
    }
    for(int i=0;i<=str2.size();i++)
    {
        f[0][i]=i;
    }
    for(int i=0;i<str1.size();i++)
    {
        for(int j=0;j<str2.size();j++)
        {
            if(str1[i]==str2[j])
            {
                f[i+1][j+1]=f[i][j];
            }
            else
            {
                f[i+1][j+1]=min(f[i+1][j],f[i][j+1])+1;
                f[i+1][j+1]=min(f[i+1][j+1],f[i][j]+1);
            }
        }
    }
    return f[str1.size()][str2.size()];
}
int main()
{
    string str1,str2;
    cin>>str1>>str2;
    int ret=LD(str1,str2);
    cout<<ret<<endl;
    return 0;
}