笔试强训day19

一. 单选

1.二分查找的时间复杂度()

A O(N*log(N))
B O(N)
C O(log(N))
D O(N^2)
正确答案:C

 
2. 有一个单向链表中有一个A、B两个相邻元素,有一个指针p指向元素A,现将一个指针r指向的S元素要插入到A和B之间,该进行操作()

A p->next=p->next->next
B r-next=p;p->next=r->next
C r->next=p->next;p->next=r
D r=p->next;->next=r->next
E r->next=p;p->next=r
F p=p->next->next
正确答案:C 


3. 双向链表中有两个指针域,llink和rlink分别指向前驱和后继,设p指向链表中的一个结点,现要求删去p所指结点,则正确的删除是()(链中结点数大于2,p不是第一个结点)

A p->llink->rlink:=p->llink; p->llink->rlink:=p->rlink; dispose(p);
B dispose(p); p->llink->rlink:=p->llink; p->llink->rlink:=p->rlink;
C p->link->rlink:=p->llink; dispose(p); p->llink->rlink:=p->rlink;
D 以上A,B,C都不对
正确答案:D


4.一个栈的入栈序列是A,B,C,D,E,则栈的不可能输出序列是() 

A EDCBA
B DECBA
C DCEAB
D ABCDE

正确答案:C


5.循环队列放在一维数组A[0…M-1]中,end1指向队头元素,end2指向队尾元素的后一个位置。假设队列两端均可进行入队和出队操作,队列中最多能容纳M-1个元素。初始时为空,下列判断队空和队满的条件中,正确的是()

A 队空:end1==end2;队满:end1==(end2+1) mod M
B 队空:end1==end2;队满:end2==(end1+1) mod (M-1)
C 队空:end2==(end1+1) mod M;队满:end1==(end2+1) mod M
D 队空:end1==(end2+1) mod M;队满:end2==(end1+1) mod (M-1)
正确答案:A


6. 已知二叉树后序遍历序列是bfegcda,中序遍历序列是badefcg,它的前序遍历序列是()

A abcdefg
B abdcefg
C adbcfeg
D abecdfg
正确答案:B

前序:根左右

中序:左根右

后序:左右根

前序+中序/后序+中序 都可以推出二叉树

后序是bfegcda可以知道a是根,再通过中序badefcg判断d在a的右边所以是a的右子树,再判断c在d的右边所以是d的右子树,再判断g在c的左边所以是c的左子树 以此类推


7.某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为()

A 不存在这样的二叉树
B 200
C 198
D 199
正确答案:B


8. 以下序列不是堆的是()

A (100,85,98,77,80,60,82,40,20,10,66)
B (100,98,85,82,80,77,66,60,40,20,10)
C (10,20,40,60,66,77,80,82,85,98,100)
D (100,85,40,77,80,60,66,98,82,10,20)
正确答案:D


9. 设有一组记录的关键字为{19,14,23,1,68,20,84,27,55,11,10,79},用链地址法构造哈希表,哈希函数为H(key)=key MOD 13,哈希地址为1的链中有()个记录

A 1
B 2
C 3
D 4
正确答案:D

算{19,14,23,1,68,20,84,27,55,11,10,79}中的值有多少个key MOD 13 = 1


10. 以下哪种排序是不稳定排序()

A 冒泡
B 插入排序
C 归并排序
D 快速排序
正确答案:D 

稳定:冒泡排序、插入排序、归并排序

不稳定:希尔排序、堆排序、快速排序

二、编程

题目ID:36846-汽水瓶
链接:https://www.nowcoder.com/practice/fe298c55694f4ed39e256170ff2c205ftpId=37&&tqId=21245&rp=1&ru=/activity/oj&qru=/ta/huawei/question-ranking

【解题思路】:
本题题意简单,每次空瓶的数量除以2,直到最后空瓶的数量少于两瓶,就累加到了课兑换的数量。 

#include<iostream>
using namespace std;
//概念法
int calcNumber_1(int n) {
    int sum = 0;
    while (n > 1) {
        int res = n / 3; //所能兑换的个数
        int left = n % 3; //遗下的个数
        sum += res;
        n = left + res;
        if (n == 2) {
            sum++;
            break;
        }
    }
    return sum;
}
//取巧法
int calcNumber_2(int n) {
    return n / 2;
}
int main() {
    int n, res;
    while (cin >> n) {
        if (n == 0)
            break;
        res = calcNumber_2(n);
        cout << res << endl;
    }
    return 0;
}

 题目ID:36889-查找两个字符串a,b中的最长公共子串
链接:https://www.nowcoder.com/practice/181a1a71c7574266ad07f9739f791506tpId=37&&tqId=21288&rp=1&ru=/activity/oj&qru=/ta/huawei/question-ranking

【解题思路】:
本题需要用动态规划求解,MCS[i][j]记录短字符串 s1 前 i 个字符和长字符串 s2 前 j 个字符的最长子串的长度,初始化所有值为 0。当 s1[i-1] = s2[j-1]时,MCS[i][j] = MCS[i - 1][j - 1] + 1,这里使用一个额外的值
start 来记录最长子串在短字符串 s1 中出现的起始位置,maxlen记录当前最长子串的长度,当MCS[i][j] >maxlen 时,maxlen = MCS[i][j], 则start = i - maxlen ;档s1[i-1] != s2[j-1]时不需要任何操作,最后获取substr(start, maxlen)即为所求。

#include<iostream>
#include<string>
#include<vector>
using namespace std;
string getComSubstr(string & str1, string & str2) {
    //寻求最短字符串
    if (str1.size() > str2.size())
        swap(str1, str2);
    int len1 = str1.size();
    int len2 = str2.size();
    vector<vector<int>> MSC(len1 + 1, vector<int>(len2 + 1, 0));
    int start = 0, max_size = 0;
    for (int i = 1; i <= len1; ++i) {
        for (int j = 1; j <= len2; ++j) {
            if (str2[j - 1] == str1[i - 1])
                MSC[i][j] = MSC[i - 1][j - 1] + 1;
            //如果有更长的公共子串,更新长度
            if (MSC[i][j] > max_size) {
                max
                _
                size = MSC[i][j];
            //以i结尾的最大长度为max, 则子串的起始位置为i - maxstart = i - max_size;
            }
        }
    }
    return str1.substr(start, max_size);
}
int main() {
    string str1, str2;
    while (cin >> str1 >> str2) {
        string substr = getComSubstr(str1, str2);
        cout << substr << endl;
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值