牛客网数组专项练习(六)
1、对矩阵压缩存储是为了()
正确答案: D
方便运算方便存储提高运算速度减少存储空间
分析:
A C,都是运算方面的好处
B,如果邻接表,还要存指针,并没有方便存储
D,不管是,邻接矩阵还是邻接表,都节省了空间
2、设有一个二维数组A[m][n],假设A[0][0]存放位置在 644,A[2][2]存放位置在676,每个元素占一个空间,问A[3][3]存放的位置在( )
正确答案: C
688
678
692
696
分析:
3、设有一个10阶对称矩阵A[10][10],采用压缩存储方式按行将矩阵中的下三角部分的元素存入一维数组B[ ]中,A[0][0]存入B[0]中,则A[8][6]在B[ ]的( )位置
正确答案: C
32
33
42
65
分析:
由于是对称矩阵,因此压缩存储可以认为只要存储下三角矩阵。
(0,0) 1
(1,0)(1,1) 2
(2,0)(2,1) (2,2) 3
(3,0)(3,1) (3,2) (3,3) 4
(4,0)(4,1) (4,2) (4,3) (4,4) 5
(5,0)(5,1) (5,2) (5,3) (5,4) (5,5) 6
(6,0)(6,1) (6,2) (6,3) (6,4) (6,5) (6,6) 7
(7,0)(7,1) (7,2) (7,3) (7,4) (7,5) (7,6) (7,7) 8
(8,0)(8,1) (8,2) (8,3) (8,4) (8,5) (8,6) 6
1+2+3+4+5+6+7+8+6=42
答案选c
4、在C++语言中,下面关于数组的描述错误的是()
正确答案: C 你的答案: D (错误)
数组的名字就是指向该数组第一个元素的指针长度为n的数组,下标的范围是0-n-1数组的大小必须在编译时确定数组可通过值参数、地址指针、引用参数三种方式传递给函数
分析;
数组可以也动态实现,int n; cin>>n,int *p=new int[n]; 指针传递也是传地址
5、以下二维数组声明中,正确的是( )。
正确答案: B 你的答案: B (正确)
char b[2][3]={"a","b","c"};char b[][3]={0};char b[2][]={0};char b[][]={0}
分析:
A.char str[2][3]表示声明了一个字符串的数组,最多可以存放两个字符串,每一个字符串的长度为3。题中{"a","b","c"}为三个字符串。
C、D.在声明数组时,数组个数可以缺省,数组长度不能缺省。该项中数组长度缺省。
6、下列数据结构具有记忆功能的是?
正确答案: C 你的答案: C (正确)
队列循环队列栈顺序表
分析:
栈是限定在一端进行插入与删除的线性表,允许插入与删除的一端称为栈顶,不允许插入与删除的另一端称为栈底。栈按照“先进后出”(FILO)或“后进先出”(LIFO)组织数据,栈具有记忆作用
7、下列给定程序中,函数fun的功能是:求ss所指字符串数组中长度最短的字符串所在的行下标,作为函数值返回,并把其串长放在形参n所指的变量中。ss所指字符串数数组中共有M个字符串,且串长小于N。
请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。
试题程序。
|
|
正确答案: C 你的答案: C (正确)
N,< ,kN, >,kM,<,kM,>,k
分析:
int fun(char(* ss)[N], int *n)
{
int i, k = 0, len = N;
for (i = 0; i < ___M___; i++) // 这里是要遍历数组,数组的长度为M,
{
len = strlen(ss[i]);
if (i == 0)
*n = len;
if (len _<___ * n); // 这里是取最小的长度,
{
*n = len;
k = i;
}
}
return ( _____ ); // 函数返回最小长度字符串的下标,这里为k
}如题,这里其实ss初始化后是一个二维数组即ss[5][20]。
ss[0][*]维度存储的是字符串"shanghai"
ss[1][*]维度存储的是字符串“guangzhou”
ss[2][*]维度存储的是字符串"beijing"
ss[3][*]维度存储的是字符串“tianjing”
ss[4][*]维度存储的是字符串“chongqing"
那么当调用fun(ss,&n)方法后,将ss作为参数传入
由fun()中for循环里的len = strlen(ss[i]);可知,len是每次获得一个维度的长度,所以循环约束条件则为数组维度的大小M=5
又知n为串长,作为形参返回,当循环第一次进行时将ss[0][*]字符串的长度赋给了n。根据
if(len ____ * n)
{
*n = len;
k = i;
}
中*n的值为len可知每次*n得到的应该是较小值,那么将len和*n比较的话只有当len<n时赋值才有意义,否则应当进入下一次循环。
最后根据 k = i可知,k是在满足每次取最小字符串长度n时,for循环的i值,即为数组的维度,也就是最小串的下标。
所以应当将k值做为返回值满足题意。
到此int fun(ss,&n)带回的就是ss[M][N]中长度最小的字符串下标,并且串长为n。
8、以下多维数组声明语句中,不正确的有( )
正确答案: B
int[,]a = new int[2,3];int[,] a = {{1,2,3}};int[2,3] a = new int[2,3];int[,] a = {{1,2,3},{2,3}}
9、如有定义:char str[20];,能将从键盘输入的字符串“How are you”保存到 str 数组的语句是( )
正确答案: C 你的答案: C (正确)
scanf("%s", str);str[] = getch();gets(str);str = gets();
分析:
getch()函数从控制台读取一个字符
gets(字符数组名或指针)
gets能够接受空格、制表符Tab和回车等。
gets和sacnf函数,在字符串接受结束后自动加'\0'
10、在一个有8个int数据的数组中,随机给出数组的数据,找出最大和第二大元素一定需要进行几次比较( )
正确答案: B 你的答案: B (正确)
8
9
10
11
分析:
第一次分组8个分成4组 两两一组 比4次 第二次分组为上面比较下来的4个还是两两分组 分2组 第三次分组就剩下两个直接比较出了最大 这时一共比较了4+2+1=7次 接着拿第三次分组中与最大比较的那个数分别和 之前与最大那个数比较过的数比较 分别是第一次分组有一个 第二次分组有一个 7+2=9