数据结构面试——数组

242 阅读5分钟

数组初始化

C++11规则的数组初始化:

int a[4] = {1,2,3,4}; //okey
int b[4];             //okey
float c[5] = {5.0, 2.5} //初始化数组时,提供的值可以少于数组的元素数目
long d[500] = {0};      // 将数组所有元素初始化为0
short e[] = {1,5,2,3};  //c++编译器自动计算元素个数
double f[4] {1.2e4, 1.6e4, 1.1e4, 1.7e4 }  //可以省略等号 =
float g[100] {}         // 大括号可以不包括任何东西, 这将把所有元素设置为0

Java数组初始化:

int[] array = new int[]{element1, element2, ...};
int[] array = {element1, element2, ...};
int[] array = new int[4];

C++和Java数组比较

Java的数组的内存分配是在堆里面,用new分配;而C++的数组内存分配在栈里,定义时会自动分配
Java数组本身就是一个对象,保存的元素是对原始类型或对象的引用,不保存对象本身

在一个有8个int数据的数组中,随机给出数组的数据,找出最大和第二大元素一定需要进行(9)次比较

比如 A B C D E F G H,通过8进4的方式,A与B比较, C与D比较.....然后再4进2,A与C比较(假设A,C比B,D大),E与G比较。再2进1,比如A与E比较(假设A,E比C,G大)选出最大的A,总共7次。
然后次大的数一定是被最大数PK下去的,所以再选B C E三个比较2次得到次大的数

                                                     A

                             A                                              E

               A                          C                    E                   G    (7次)

       A             B            C           D       E          F      G           H

 

再选 BCE中最大的(2次),共9次,不过可以这个方法比较次数是少一点,但是所需要的空间大,要记下与沿途的最大值比较的数。

对于选择问题,找最大问题的下界是:n-1
找第二大问题的下界是:n+logn-2
n=8, 8 + 3 - 2 = 9

已知int a[3][4];则下列能表示a[1][2]元素值的是 *(*(a+1)+2)

线性表的顺序存储结构是一种(随机存储) 的存储结构,线性表的链式存储结构是一种顺序存取的存储结构

因为线性表的顺序存储结构实现方式是将数据元素存储在一段连续的空间中,元素的地址可以根据顺序表首地址和下标求得,从而可以实现在表中任意位置的存取,即随机存取,而链式存储元素的物理地址不一定是连续的,所以只能通过前面的元素顺序存储。

线性结构

线性是线性,顺序是顺序,线性是逻辑结构,顺序是存储结构,两者不是一个概念,线性是指一个元素后继只有唯一的一个元素或节点,非线性是一个元素后面可以有多个后继或前继节点,顺序是指存储结构连续,例如数组是顺序的,链表不是顺序的,但他们都是线性的。当然顺序也可以是非线性的,例如顺序结构存储非线性结构的二叉树。

在 C/C++ 中,若有定义 char a [10], *p=a; ,那么下列赋值语句正确的是(p="abcdefg ";)

C/C++中双引号的作用是:

1.申请了空间(在常量区),存放了字符串
2. 在字符串尾加上了'/0'
3.返回地址

所以这里双引号返回的地址赋给p,这只改变了p的指向,并没有给数组赋值。

设有一个长度为n的顺序表,要在第i(从1开始)个元素之前(也就是插入元素作为新表的第i个元素),则移动元素个数为 n-i+1

array = [1, 2, 3, 4, 5]
n = 5
插入后:array = [1, [], 2, 3, 4, 5]
移动次数为n-i+1

有一个100*90的稀疏矩阵,非0元素有10个,设每个整型数占2字节,则用三元组表示该矩阵时,所需的字节数是 66

除了存储非零元素,还要存储矩阵的行数、列数和总元素个数,所以总共需要 10*3*2 + 3*2 = 66

数组元素的地址计算与数组的存储方式无关(X)

数组的存储方式可以分按行优先和按列优先

一个有序数列,序列中的每一个值都能够被2或者3或者5所整除,这个序列的初始值从1开始,但是1并不在这个数列中。求第1500个值是多少?

2,3,5的最小公倍数是30,30以内符合条件的数有22个,[31, 60]内符合条件的数也有22个,所以可以求得1500 / 22 = 68, 1500 % 22 = 4,第69个周期的第四个数是5, 最终答案是68*30 + 5 = 2045

定义二维数组时不能省略第二维的大小

以下能对二维数组 a 进行正确初始化的语句是()
正确答案: B D

A.int a[2][]={{1,0,1},{5,2,3}};
B.int a[][3]={{1,2,3},{4,5,6}};
C.int a[2][4]={1,2,3},{4,5},{6}};
D.int a[][3]={{1,0,1},{},{1,1}};

Java声明数组时不定义数组大小,只有被初始化时才会给数组创建存储空间

jdk8之前的hashmap的数据结构是数组+红黑树/链表,JDK8及其以后版本,HashMap的数据结构是数组+链表+红黑树

便于插入和删除的容器是list、map、set

  1. list: 底层数据结构为双向链表,支持快速增删
  2. vector: 底层数据结构为数组,支持快速随机访问
  3. map: 底层数据结构为红黑树,除了hashmap无序,其他实现结构有序,不重复
  4. set: 底层数据结构为红黑树,除了hashset无序,其他实现结构有序,不重复

在32位机器上,char str[]="Hello", sizeof(str) = 6

str = {'H','e','l','l','o','\0'}

从一个无序数组中挑选出其中前十个最大的元素,在以下的排序方法中最快的方法是 堆排序

快速排序
堆排序
归并排序
基数排序