笔试强训48天——day20

一. 单选

1.对于顺序存储的线性表,访问结点和增加结点的时间复杂度为()。

A O(n) O(n)
B O(n) O(1)
C O(1) O(n)
D O(1) O(1)
正确答案:C

访问永远是O(1)
增加结点:数据越多,花费的时间就越多 O(N)

2.在下列链表中不能从当前结点出发访问到其余各结点的是()

A 双向链表
B 单循环链表
C 单链表
D 双向循环链表

正确答案:C

3.完成在双向循环链表结点 p 之后插入 s 的操作是()

A p->next=s;s->prior=p;p->next->prior=s;s->next=p->next
B p->next->prior=s;p->next=s;s->prior=p;s->next=p->next
C s->prior=p;s->next=p->next;p->next=s;p->next->prior=s
D s->prior=p;s->next=p->next;p->next->prior=s;p->next=s

正确答案:D

只需修改四个指针
最好画图理解
先修改新结点的前驱和后继

4. 栈是一种只能在某一端插入和删除的特殊线性表,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,若6元素为A、B、C、D、E、F出栈顺序为B、D、C、F、E、A,则S栈的最小容量为()。

A 3
B 4
C 5
D 6

正确答案:A

入栈顺序:A、B、C、D、E、F
出栈顺序:B、D、C、F、E、A
先入AB出B,再入CD(此时栈中含有数据:ACD)出DC,再入EF(此时栈中含有数据:AEF)出FEA
最多也只用了三个

5.现有一循环队列,其队头指针为front,队尾指针为rear;循环队列长度为N。其队内有效长度为()(假设队头不存放数据)

A (rear - front + N) % N + 1
B (rear - front + N) % N
C (rear - front) % (N + 1)
D (rear - front + N) % (N - 1)
正确答案:B

队头不存放数据——多留一个空间不使用
相减会出现负数所以要+N,循环队列要取模

6. 下述结论中,正确的是()

①只有一个结点的二叉树的度为0;
②二叉树的度为2;
③二叉树的左右子树可任意交
换;
④深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树

A ①②③
B ②③④
C ②④
D ①④
正确答案:D

二叉树0 1 2(空树,只有左树或只有右树)
二叉树是有序的,不能随意交换

7.若将关键字1,2,3,4,5,6,7 依次插入到初始为空的平衡二叉树 T 中,则 T 中平衡因子为 0 的分支结

点的个数是( )
A 0
B 1
C 2
D 3
正确答案:D

8. 初始序列为1 8 6 2 5 4 7 3一组数采用堆排序,当建堆(小根堆)完毕时,堆所对应的二叉树中序遍历序列为()

A 8 3 2 5 1 6 4 7
B 3 2 8 5 1 4 6 7
C 3 8 2 5 1 6 7 4
D 8 2 3 5 1 4 7 6
正确答案:A

调整永远从最后一个分支进行调整

9. 解决散列法中出现冲突问题常采用的方法是()

A 数字分析法、除余法、平方取中法
B 数字分析法、除余法、线性探测法
C 数字分析法、线性探测法、多重散列法
D 线性探测法、多重散列法、链地址法

正确答案:D

10.下列选项中,不可能是快速排序第2趟排序结果的是 ()

A 2,3,5,4,6,7,9
B 2,7,5,6,4,3,9
C 3,2,5,4,7,6,9
D 4,2,3,5,7,6,9
正确答案:C

第一次是红色
第二次是蓝色
单趟:
选出一个key,一般是最左边或者是最右边
要求排完之后要求:左边比key要小,右边比key要大
hoare版本
选定最左边为key,R先从后往前走找到比key小的数(此时L是不动的,等R找完L再开始),然后L再从前往后走找到比key大的数,此时两者交换,然后继续,直到R与L相遇,将该位置的值与key交换

 
 

二. 编程

1. 字符串反转

链接

接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)

输入描述:
输入一行,为一个只包含小写字母的字符串。
输出描述:
输出该字符串反转后的字符串。

示例1:
输入
abcd
输出
dcba

正确答案:

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

void ReverseStr(string &s)
{
    
    
    int start = 0;
    int end = s.size()-1;
    while(start < end)
    {
    
    
        char tmp = s[start];
        s[start] = s[end];
        s[end] = tmp;
        start++;
        end--;
    }
}

int main() 
{
    
    
    string s;
    while(cin>>s){
    
    
        ReverseStr(s);
        cout<<s<<endl;
    }
    return 0;
}    
    

 
 

2. 公共子串计算

链接

给定两个只包含小写字母的字符串,计算两个字符串的最大公共子串的长度。
注:子串的定义指一个字符串删掉其部分前缀和后缀(也可以不删)后形成的字符串。

进阶:时间复杂度: ,空间复杂度:
输入描述:
输入两个只包含小写字母的字符串
输出描述:
输出一个整数,代表最大公共子串的长度

示例1:
输入
asdfas
werasdfaswer
输出
6

正确答案:

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

int GetMax(const string &s1, const string &s2)
{
    
    
    int len1 = s1.size();
    int len2 = s2.size();

    vector<vector<int>> msc(len1,vector<int>(len2,0));//msc[len1][len2]

    int max = 0;
    for(int i = 0;i<len1;i++)
    {
    
    
        for(int j = 0;j<len2;++j)
        {
    
    
            if(s2[j] == s1[i])
            {
    
    
                if(i>=1 && j>=1)
                msc[i][j] = msc[i-1][j-1]+1;
                else
                msc[i][j] = 1;

                if(msc[i][j] > max)
                max = msc[i][j];
            }
        }
    }
return max;
}

int main() 
{
    
    
    string s1,s2;
    while(cin>>s1>>s2){
    
    
        int max = GetMax(s1,s2);
        cout<<max<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Ll_R_lL/article/details/128083483