48天笔试强训——第22天

83 阅读2分钟

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


选择题

image.png

因为链表是不支持随机访问的,又是因为它是有序的双向链表,只需要变量一遍就可以定位删除。所以时间复杂度为O(N)

image.png

就是b选项,没有什么疑问。

image.png

一定要最后处理p的前一个节点。首先要先处理q,把q的前后指针链接上、然后处理p前面的节点,最后处理p。

image.png

我们只需要两个栈相对增长就可以,所以栈底放在数组的头和尾即可。

image.png

当头尾相等的时候,元素为空或者是满(与具体的代码实现还是有差别的)

image.png

用一个队列进行辅助遍历,实现层序遍历。

image.png

插入完成之后二叉树的样子,所以深度为5。 image.png

image.png

topk问题还是要用堆排序还是不错的。

image.png

看下面的这个图,6个数字总共查找12次,所以平均查找长度为2. image.png

image.png

希尔排序和直接插入排序都可以归为插入排序。对于插入排序,如果是按照从小到大的顺序进行排列的话,那么关键字的大小会影响他的比较次数。直接选择排序无论关键字是大还是小,都要遍历一遍。

编程题

小易的升级之路

本题很简单,题目说的非常清楚,可以说本题最大的难点就是求最大公约数吧,也是非常简单的。

#include <iostream>
using namespace std;
int GCD(int a,int b)
{
    int t;
    while(a%b)
    {
        t=a%b;
        a=b;
        b=t;
    }
    return b;
}
int main()
{
    int n,a;
    while(cin>>n>>a)
    {
        int t;
        for(int i=0;i<n;i++)
        {
            cin>>t;
            if(a>=t)
            a+=t;
            else
            a+=GCD(a,t);
        }
        cout<<a<<endl;
    }
    return 0;
}

找出字符串中第一个只出现一次的字符

我们把所有的字符以及它们出现的次数存到哈希表中,然后再从第一个字符查找它出现几次,如果是一次直接输出,遍历完整个数组都没有出现只出现一次的字符,就输出-1.

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;

int main()
{
    string str;
    cin>>str;
    unordered_map<char,int> unmap;
    for(auto x:str)
    {
        unmap[x]++;
    }
    for(auto x:str)
    {
        if(unmap[x]==1)
        {
            cout<<x<<endl;
            return 0;
        }
    }
    cout<<"-1"<<endl;
    return 0;
}