鏈接: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;
}