深信服校园招聘c/c++软件开发B卷

链接:https://www.nowcoder.com/test/23090664/summary

1、位对齐

编写函数align_n,将size的低n位(即:0到n-1位)清零,如果清零前size的低n位不为全零,则在第n位上加1。n满足32>n>0。

align_n的函数原型:

unsigned int align_n(unsigned int size, int n);

输入描述:

size(十六进制),n(十进制)

输出描述:

align_n的运算结果(十六进制)

输入例子1:

0x7,3

输出例子1:

0x8

输入例子2:

0x8,3

输出例子2:

0x8

输入例子3:

0x1,3

输出例子3:

0x8
#include <iostream>
using namespace std;
unsigned int align_n(unsigned int size, int n) {
    bool flag = false;
    for (int i = 0; i < n; i++) {
        if (size & 1)
            flag = true;
        size >>= 1;
    }
    size += flag;
    return size << n;
}
int main() {
    unsigned int size, n;
    scanf("%x,%d", &size, &n);
    printf("0x%x", align_n(size, n));
    return 0;
}

2、堆排序

函数heap_sort使用堆排序方法对数组arr进行排序,排序后数据为降序。相关代码如下,请补充缺失部分。

输入描述:

第一行为数据个数 第二行为输入数据

输出描述:

排序过程的中间数据,及已经排好序的数据

输入例子1:

10
100 32 3 6 24 86 23 90 78 3
static void heap_arrange(int arr[], int cur, int cnt)  //调整为小顶堆
{
    int heaptop_val = arr[cur]; //堆顶的值
    while (cur < cnt) {
        int left = 2 * cur + 1;
        int right = 2 * cur + 2;
        int min = -1;
        int min_val = heaptop_val;
        if (left < cnt && arr[left] < min_val) { //检查是否比左节点大
            min = left;
            min_val = arr[left];
        }
        if (right < cnt && arr[right] < min_val) {//检查是否比右节点大
            min = right;
            min_val = arr[right];
        }
        if (min == -1)
            break;
        arr[cur] = min_val;
        cur = min;
    }
    arr[cur] = heaptop_val;
}

3、最优二叉树

有一个节点数组,需要创建一棵最优二叉树,即每个节点的权值乘以节点在树中的长度,然后相加得到的值最小。以下图一为例,节点数组的[A,B,C,D,E]的权值分别为[15,7,6,6,5],构建好的最优二叉树见图二。

相关框架代码已经给出,请补充缺失部分,保证程序正常运行,输出预期结果。

输入描述:

第一行为数据个数 第二行为权值(整数)

输出描述:

构建的二叉树(用于绘图软件生成对应的二叉树图形)

输入例子1:

5
15 7 6 6 5

输出例子1:

```mermaid
graph TD
	n0[n0:15]
	n0 --> n8
	n1[n1:7]
	n1 --> n6
	n2[n2:6]
	n2 --> n5
	n3[n3:6]
	n3 --> n6
	n4[n4:5]
	n4 --> n5
	n5((11))
	n5 --> n7
	n6((13))
	n6 --> n7
	n7((24))
	n7 --> n8
	n8((39))
```
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
static void heap_arrange(int arr[], int cur, int cnt);
 
static int heap_verify(int arr[], int cnt)
{
    int i;
    for (i = 0; i < cnt / 2; ++i) {
        int lhs = 2 * i + 1;
        int rhs = 2 * i + 2;
 
        if (lhs < cnt && arr[i] > arr[lhs]) {
            fprintf(stderr, "arr[%d]:%d > arr[%d]:%d\n", i, arr[i], lhs, arr[lhs]);
            return -1;
        }
        if (rhs < cnt && arr[i] > arr[rhs]) {
            fprintf(stderr, "arr[%d]:%d > arr[%d]:%d\n", i, arr[i], rhs, arr[rhs]);
            return -1;
        }
    }
    return 0;
}
 
static void heap_print(int arr[], int cnt)
{
    int layer = 0, num = 0;
    for (layer = 0; num < cnt; ++layer) {
        int i = 0;
        for (i = 0; i < (1 << layer) && num < cnt; ++i)
            printf("%3d ", arr[num++]);
        printf("\n");
    }
}
static void heap_sort(int arr[], int cnt)
{
    int i;
 
    printf("origin:\n");
    heap_print(arr, cnt);
    //  建堆
    for (i = cnt / 2 - 1; i >= 0; --i) {
        heap_arrange(arr, i, cnt);
    }
    printf("make heap:\n", i);
    heap_print(arr, cnt);
    assert(heap_verify(arr, cnt) == 0);
    for (i = cnt - 1; i > 0; --i) {
        int tmp;
        tmp = arr[0];
        arr[0] = arr[i];
        arr[i] = tmp;
        printf("sort i=%d\n", i);
        heap_print(arr, cnt);
        heap_arrange(arr, 0, i);
        heap_print(arr, cnt);
        assert(heap_verify(arr, i) == 0);
    }
    printf("sorted:\n");
    heap_print(arr, cnt);
}
static int input(int** arr, int* size)
{
    int i;
    int ret;
 
    ret = scanf( "%d", size);
    if (ret != 1)
        return -1;
    *arr = (int*)malloc(sizeof(int) * (*size));
    for (i = 0; i < *size; ++i) {
        scanf( "%d", &(*arr)[i]);
    }
    return 0;
}
 
int main(int argc, char* argv[])
{
    int* arr = NULL;
    int cnt = 0;
    int i; 
    if (input(&arr, &cnt) < 0) {
        fprintf(stderr, "input error\n");
        return 0;
    }
    heap_sort(arr, cnt);
    return 0;
}
//  调整为小顶堆
static void heap_arrange(int arr[], int cur, int cnt)  //调整为小顶堆
{
    int heaptop_val = arr[cur]; //堆顶的值
    while (cur < cnt) {
        int left = 2 * cur + 1;
        int right = 2 * cur + 2;
        int min = -1;
        int min_val = heaptop_val;
        if (left < cnt && arr[left] < min_val) { //检查是否比左节点大
            min = left;
            min_val = arr[left];
        }
        if (right < cnt && arr[right] < min_val) {//检查是否比右节点大
            min = right;
            min_val = arr[right];
        }
        if (min == -1)
            break;
        arr[cur] = min_val;
        cur = min;
    }
    arr[cur] = heaptop_val;
}

猜你喜欢

转载自blog.csdn.net/qq_40946921/article/details/106578325