2023项目组招新

一、选择题(6×5=30分)

1、下列程序段的时间复杂度是( B

int sum = 0;
for (int i = 1; i < n; i *= 2)
for (int j = 0; j < i; j++)
sum++;

A. O*(log⁡*n)

B. O*(*n)

C. O*(nlog⁡n)

D. O*(*n²)

根据给定的代码片段,我们可以分析其时间复杂度。

外层循环的迭代次数由 i *= 2 控制,i 的初始值为 1,每次循环将 i 乘以 2,直到 i 不小于 n 时退出循环。因此,外层循环的迭代次数为 log₂(n)

内层循环的迭代次数由外层循环的当前 i 控制,每次循环从 0 迭代到 i-1,共 i 次迭代。

因此,总的迭代次数可以表示为:

1 + 2 + 4 + 8 + ... + n/4 + n/2 + n

这是一个等比数列求和,根据等比数列求和公式,可知总的迭代次数为 2n - 1

因此,根据迭代次数分析,给定代码片段的时间复杂度为 O(n)

2、以下叙述中正确的是( A

A、函数名代表该函数入口地址

B、所有函数不能接受函数名作为实参传入

C、函数体中的语句不能对自己的调用

D、如果函数带有参数,就不能调用自己

3、在 C 语言中,以下哪个选项是正确的文件打开模式(B

A. r+b

B. w+b

C. a+b

D. r+w+b

解析:w+b 是 C 语言中用于读写二进制文件的模式。其他选项分别表示读取文本文件(r)、写入文本文件(w)和追加文本文件(a)

4、在 Java 语言中,以下哪个选项是正确的错误处理方式( A

A. try-catch-finally

B. throw-catch-finally

C. catch-throw-finally

D. finally-catch-throw

5、C语言中,不合法的字符常量是( B

A. ‘\t’

B.“a”

C. ‘a’

D.‘\x32’

6、C语言的编译过程( B

a.预处理 b.汇编 c.编译 d. 链接

A. abcd

B. acbd

C. adbc

D. abc

二、填空题(6×5=30分)

1、下面代码的f()执行了( 10)次

int n = 11;
while(--n) f();

2、已知字母a的ASCII码为十进制数97,且设ch为字符型变量,则表达式 ch = 'a' + 8 - 3;ch的值为( ‘f’)(用字符来表示)

3、char str[]=“1234”, *p=str,则 *(p+1)是(2

4、下面代码输出是(6

int a = 10 + 2 >> 1;
printf("%d", a);

5、以下代码段的输出结果是(12

int x = 5;
int y = x++ + ++x;
printf("%d", y);

6、以下代码段的输出结果是(a

char ch1='A',ch2='a';
printf("%c",(ch1,ch2));

在给定的代码中,使用了逗号操作符(ch1, ch2)作为printf函数的参数。

逗号操作符在C语言中的作用是对多个表达式进行求值,并返回最后一个表达式的值。在这种情况下,(ch1, ch2)首先对ch1求值,然后对ch2求值,最终返回ch2的值。

三、算法设计-反转链表(20分)

csdn:

https://blog.csdn.net/nanfeibuyi/article/details/90116419?ops_request_misc=%7B%22request%5Fid%22%3A%22168777884716800188565755%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&request_id=168777884716800188565755&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-90116419-null-null.142

#include <stdio.h>
#include <stdlib.h>

//链表节点定义
typedef struct s_node
{
int data;
struct s_node* pNext;
}Node;

Node* create_list_head();
Node* create_new_node(int node_data);
int add_node_head(Node* head, Node* new_node);
void display_list(Node* head);
void free_list(Node* head);
Node* revert_list(Node* head);

int main(int argc, char *argv[])
{
//创建链表
Node* head = create_list_head();
if(NULL == head)
{
printf("create_list_head failed!\n");
return -1;
}

//填充数据(添加节点)
int i;
for(i=1; i<8; i++)
add_node_head(head, create_new_node(i));

//打印原来链表数据
printf("befor ");
display_list(head);

//反转链表
head = revert_list(head);
printf("after ");
display_list(head);

//释放链表空间
free_list(head);
return 0;
}

//创建链表
Node* create_list_head()
{
Node* head = (Node*)malloc(sizeof(Node));
if(NULL != head)
{
head->data= -1;
head->pNext= NULL;
}
return head;
}

//创建新节点
Node* create_new_node(int node_data)
{
Node* new_node = (Node*)malloc(sizeof(Node));
if(NULL != new_node)
{
new_node->data= node_data;
new_node->pNext= NULL;
}
return new_node;
}

//头插法
int add_node_head(Node* head, Node* new_node)
{
if(NULL == head || NULL == new_node)
return -1;
new_node->pNext = head->pNext;
head->pNext = new_node;
return 0;
}

//打印链表数据
void display_list(Node* head)
{
if(NULL == head)
return;
Node* tmp = head;
printf("list data:");
while(NULL !=(tmp=tmp->pNext))
{
printf("%d ", tmp->data);
}
printf("\n");
}

//释放链表
void free_list(Node* head)
{
if(NULL == head)
return;
Node* p = head;
while(p = p->pNext)
{
head->pNext = p->pNext;
//printf("free:%d\n", p->data);
free(p);
p = head;
}
free(head);
}

//头插方式1-反转链表
Node* revert_list(Node* head)
{
if(NULL == head)
return;

Node* p = head->pNext;
head->pNext= NULL;
Node* tmp = NULL;
while(p)
{
tmp = p->pNext;
add_node_head(head, p);
p = tmp;
}

return head;
}