牛客网——选择题之解

1、在最好情况下,下列排序算法中 排序算法时间复杂度最低的是。

题解: https://blog.csdn.net/qq_29720657/article/details/78399558

 

 

 2、串中任意个字符组成的子序列称为该串的子串。

 题解:该题目是错误的,并且错在任意,对于给定的一个字符串来说,而它的子串是需要连续的,而并不是任意的。

3、设以下c语句中,对数组array定义后,数组元素array[1][2]的值为:()

1

int array[2][3]={1,2,3,4,5};

题解:答案为0;该题目是定义了一个整型为两行三列的二维数组,但是它的元素 且只有5个,在整型的数组中,对于一个数组中的元素如果赋的值比该实际所赋的值的个数少,其余的用默认为零;因此该题应为0.

4、 设A是n*n的对称矩阵,将A的对角线及对角线上方的元素以列为主的次序存放在一维数组B[1..n(n+1)/2]中,对上述任一元素aij (1≤i,j≤n,且i≤j)在B中的位置为()

题解:j(j-1)/2+i

由于题目要求是以列为主的次序,故答案为:j(j-1)/2+i

5、链表与数组的优缺点

题解:1、数组静态分配内存,链表动态分配内存;2、 数组在内存中连续,链表可连可不连续; 3、数组元素在栈区,链表元素在堆区; 4、数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n); 5、数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1) 

6、在一个长为33厘米的光滑凹轨上,在第3厘米、第6厘米、第19厘米、第22 厘米、第26厘米处各有一个钢珠,凹轨很细,不能同时通过两个钢珠,开始时,钢珠运动方向是任意的。两个钢珠相撞后,以相同速度反向运动。假设所有钢珠初 始速度为每秒运动1厘米,那么所有钢珠离开凹轨的最长可能时间是()

题解:30,https://blog.csdn.net/luoweifu/article/details/12071865 

7、排序的稳定性

题解: 稳定排序:冒泡排序、插入排序、归并排序、基数排序
不稳定排序:选择排序、快速排序、希尔排序、堆排序。

8、二分搜索法

题解: 1、只能在已排序的数据上进行;2、可用于排好序的数组

9、

请找出下面代码中的所有错误。说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

1 #include "string.h"

2 int main() 

3 {

4    char *src = "hello,world";

5    char *dest = NULL;

6    int len = strlen(src);

7    dest = (char *)malloc(len);

8    char *d = dest;

9    char *s = src[len];

10   while (len-- != 0)

11      *d++ = *s--;

12   printf("%s", dest);

13   return 0;

14     

15}

题解: 

int main()

{

    char *src = "hello,world";

    int len = strlen(src);

    char *dest = (char *)malloc(len + 1); //要为\0分配一个空间

    char *d = dest;

    char *s = &src[len - 1]; //指向最后一个字符

    while ( len-- != 0 )

        *d++ = *s--;

    *d = 0; //尾部要加\0

    printf("%s\n", dest);

    free(dest);// 使用完,应当释放空间,以免造成内存汇泄露

    return 0;

}

10、空串与由空格组成的串没有区别

 题解:答案有区别。

空格串和空串的区别是: 空格串是程序设计中的术语,指的是由空格组成的非空串,其长度为串中空格字符的个数。 空串(null string)是指长度为零的串。 注意:空格串并非空串,空格串中的空格占据相应的存储空间。

 11、使用二分查找算法在一个有序序列中查找一个元素的时间复杂度为( )

题解;答案:logn

因为二分查找算法是折半,相当于一个二叉树,因此该查找一个元素的时间复杂度为对数级。

12、

下面函数的功能是

int fun(char *x)
{
    char *y = x;
    while (*y++);
    return (y - x - 1);

题解: 

分析fun函数,  char *y = x;//定义y指针指向x指针指向的字符串,此时x与y指针地址相同

 while (*y++);//当*y!='\0'时,指针指向字符串的下一位,直到*y=='\0',由于此时还会执行++操作符,所以此时y指针指向字符串末尾结束符的下一位,即此时指针y已经移动了字符串长度+1位,

所以y-x-1即为字符串的长度

13、设 int x[]={1,2,3,4,5,6},*p=x; 则值为 3 的表达式是(B)

题解:A、p+=2,*++p;//*p=x这里指针p指向数组x的首元素地址,p+=2就相当于p指向数组中的第三个元素;又因为*++p,是先加p再取*++p所指向存放该值得地址——*++p=4;因此不符合条件

B、p+=2,*p++;//同理:*p++是先取值再加加,因此*p++=3,而p已经指向数组下标为三的元素了

C、p+=3,*p;//同理:*p=4

D、p+=2,++*p ;//同理:++*p=4

 14、串是一种特殊的线性表,其特殊性体现在()

题解:串又称为字符串,是一种特殊的线性表,其特殊性体现在数据元素是一个字符,也就是说串是一种内容受限的线性表。

15、若有定义"char a [10], *p=a; ”,那么下列赋值语句正确的是(D )

题解:A、a [] ="abcdefg";//*p=a这里指针p指向数组a的首元素地址

B、a=”abedefg";

C、*p=”abcdefg";

D、 p=”abcdefg ";

将字符串赋值给字符数组:

1.定义时直接用字符串赋值。 char a[10]="hello";但是不能先定义再赋值,即以下非法:char a[10];a[10]="hello";  A、错

2.利用strcpy。 char a[10]; strcpy(a,"hello");

3.利用指针。 char *p; p="hello";这里字符串返回首字母地址赋值给指针p。另外以下非法:char a[10]; a="hello"; a已经指向在堆栈中分配的10个字符空间,不能再指向数据区中的"hello"常量。可以理解为a是一个地址常量,不可变,p是一个地址变量。 B、C、错

4.数组中的字符逐个赋值。

16、 对以下二维数组的正确声明

解题:数组存储数据是行优先存储,如果只定义行不定义列数组存储就没有界限。给出总元素个数,行数等于总元素对列数取整。编辑器会根据列数去计算行数,但不会根据行数去计算列数

因此

int[][] a=new int[][3]; 错

int[][] b=new int[3][]; 对

17、

选项代码中能正确操作数组元素的是()

1

2

3

4

5

6

7

8

9

int main(){

  int a[N][N]={{0,0},{0,0}};

  for(int i=0;i<N;i++){

     for(int j=0;j<N;j++){

       //访问二维数组a的值

       //选项代码

      }

    }

}

题解:A、*(*(a+i)+j)=1 

B、*(a[i]+j)=1

C、**(a+i)[j]=1

D、*((a+i)+j)=1//a+i中a代表的是地址,i是一个常量,i的步长是1,因为数据类型的不同,因此,所分配的数组中的每一个元素之间的地址差是不一样的。故D错

因此数组名当被直接使用时,是一个指向数组首地址的指针。如果数组是***数组,那么数组名是指向第一行数组的首地址,而不是第一行第一列单个元素的地址,所以*(a+i)与a[i]是一个意思,当直接用a[i]时代表的是该一维数组的首地址,所以*(a[i]+j)是与a[i][j]等效,所以AB选项正确 

18、使用二分搜索算法在 1000 个有序元素表中搜索一个特定元素,在最坏情况下,搜索总共需要比较的次数为(10 ) 

题解:

二分搜索的时间复杂度是:

O(log2 n)如果是整数,则就是这个数,如果不是整数,那么就取下线然后再加1

 

19、下列哪个查找方法的平均查找长度与查找表中数据元素个数无关?

题解:同1

20、 线性表的长度是线性表所占用的存储空间的大小。

题解:

线性表长度的定义是它所包含的元素的个数。

元素的类型决定了元素所占用存储空间的大小,但元素的个数不等价于元素的类型。

故F

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值