深信服校園招聘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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章