第5讲 数组

第5讲 数组
第5讲 数组

第5讲数组

学习目标:

1、掌握一维数组和多维数组的定义、初始化和引用。

2、掌握字符串与字符数组的应用。

3、掌握字符串处理函数的应用。

一、一维数组

(一)一维数组定义

1、格式:类型说明符数组名[常量表达式];

例如:int a[5];

2、说明

(1)数组元素下标下界值从0开始。如数组a有5个元素,它们是

a[0],a[1],a[2],a[3],a[4]。

(2)不可动态地定义数组元素个数。

如 int n;

scanf(“%d”,&n);

int a[n];/* 非法 */

(二)一维数组初始化

1、定义数组时,对数组赋初值

如:int a[5]={0,1,2,3,4};/*即 a[0]=0 a[1]=1…a[4]=4 */ 2、对部分元素赋初值

如:int a[5]={0,1,2};

3、对所有数组元素赋初值0;

如:int a[5]={0}; /* a[0]=a[1]=……=a[4]=0 */

4、对所有数组元素赋初值时,可不指定数组长度。

如:int a[ ]={0,1,2,3,4};

(三)一维数组元素的引用

数组元素引用时,其下标可为整型常量、变量或整型表达式。如:main()

{int i,a[10];

for(i=0;i<10;i++)

a[i]=i;

for(i=9;i>=0;i--)

printf(“%d”,a[i]);

}

(四)一维数组的应用

例1、用数组求Fibonacci数列问题

main()

{ int i;

static int f[20]={1,1};

for(i=2;i<20;i++)

f[i]=f[i-2]+f[i-1];

for(i=0;i<20;i++)

{ if(i%5= =0)printf(“\n”);

printf(“%12d”,f[i]);

}

}

例2、用起泡法对10个数排序(由小到大)。

main()

{ int a[11];

int i, j, t;

printf("input 10 numbers :\n");

for (i=1; i<11; i++) scanf("%d", &a[i]);

printf("\n");

for(j=1; j<=9; j++)

for(i=1; i<=10-j; i++)

if (a[i]>a[i+1])

{t=a[i]; a[i]=a[i+1]; a[i+1]=t; }

printf("the sorted numbers :\n");

for(i=1; i<11; i++)

printf("%d ", a[i]);

}

二、二维数组

(一)二维数组定义

1、格式:类型说明符数组名[行下标数][列下标数];

例如:int a[3][4];

2、说明

(1)可以把二维数组看作是一种特殊的一维数组,即它的元素又是一个一维数组。例如,可把a看作是一个一维数组,它有3个元素:a[0]、a[1]、a[2],每个元素又是一个包含4个元素的一维数组。

a[0] →a[0][0], a[0][1], a[0][2], a[0][3]

a[1] →a[1][0], a[1][1], a[1][2], a[1][3]

a[2] →a[2][0], a[2][1], a[2][2], a[2][3]

(2)二维数组在内存中是按行方式存储的,即存完第1行元素后,再存第2行,以此类推。

(二)二维数组初始化

1、分行赋初值

如:int a[2][3]={{1,2,3},{4,5,6}};

2、按顺序赋初值

如:int a[2][3]={1,2,3,4,5,6};

3、部分赋初值

如:int a[2][3]={{1},{2,3}};

4、对全部元素都赋初值,在定义数组时对第一维的长度可以不指定,但第二维的长度不能省。

如:int a[2][3]={1,2,3,4,5,6};

等价 int a[][3]={1,2,3,4,5,6};

(三)二维数组元素的引用

一般借用双重循环结构对二维数组各元素进行输入和输出的操作。

(四)二维数组的应用

例1:有一个3*4的矩阵求出其中最大值的元素的值及其所在的行号和列号。

main()

{ int i,j,row=0,colum=0,max;

int a[3][4]={{1,3,4,5},{9,7,8,0},{-1,10,12,2}};

max=a[0][0];

for(i=0;i<3;i++)

for(j=0;j<4;j++)

if(a[i][j]>max)

{ max=a[i][j];row=i;colum=j;}

printf(“%d,%d,%d\n”,max,row,colum);

}

三、字符数组

(一)字符数据定义

即定义为字符类型的数组,主要用于存入字符数据,字符数组的每个元素存入一个字符。例如:char str1[10], str2[3][8];

(二)字符数组的初始化

1、逐个字符初始化(与前面一维数组和二维数组的初始化类似)

如:char ch[10]={ …c?,…h?,…i?,…n?,…a?};

说明:

只对前5个数组元素赋初值,剩下5个元素自动赋?\0?值。

若省去下标10,则ch字符数组只有5个元素。

2、赋字符串为初值

如:char ch[6]={“china”};或char ch[ ]=“china”;或char ch[ ]={“china”};

说明:

每个字符串都以?\0?字符作为结束标记符,所以字符串中的各个字符依次存入字符数组元素中后,还需用一个元素存放?\0?字符。

(三)字符数组的引用

1、逐个字符输入输出

main( )

{ char ch[10];

int j=0;

do

{ scanf(“%c”,&ch[j]);

j++;

}while(j<10 && ch[j-1]!=’\n’);

for(j=0;j<10 && ch[j]!=’\n’;j++)

printf(“%c”,ch[j]);

}

2、输入输出一个字符串

main( )

{ char ch[10];

scanf(“%s”,ch) /* 不应在ch前加&符号 */

printf(“%s”,ch);

}

说明:

(1)如输入 computer回车,则将9个字符存入数组ch。

(2)scanf()函数不能接受含有空格的字符串。如输入turbo C回车,则ch的值为turbo (3)此时可用gets()函数解决(2)的问题,gets(ch);如上输入,则ch的值为turbo C

四、字符串处理函数

(一)常用字符串处理函数介绍

1、gets 字符串输入函数

(1)调用形式:gets(字符数组)

(2)功能:从终端输入一个字符串数组,并且得到一个函数值,该函数的返回值是字符数组的起始地址。

2、puts 字符串输出函数

(1)调用形式:puts(字符串)

(2)功能:将一字符串(以′\0′为结束符)输出到终端。输出时将字符串结束标志转换成′\n′,即输出完毕后换行。

3、strcmp 字符串比较函数

(1)调用形式:strcmp(字符串1,字符串2)

(2)功能:将两个字符串从左至右逐个进行比较(按ASCII码值大小比较),直到出现不同的字符或遇到′\0′为止。比较的结果由函数值带回。

函数值=0 ——字符串1=字符串2

函数值>0 ——字符串1>字符串2

函数值<0 ——字符串1<字符串2

4、strcpy 字符串拷贝函数

(1)调用形式:strcpy(字符数组1,字符串2)或strcpy(字符数组1,字符串2, n) (2)功能:将字符串2拷贝到字符数组1中去。

(3)说明:

字符数组1必须定义得足够大,以便容纳被拷贝的字符串;

不能用赋值语句将一个字符串常量或字符数组直接级字符数组。如:char str1[10],str2[10];

str1=”china”; /*语法错*/

str2=str1; /*语法错*/

也可以用strcpy函数将字符串2前若干个字符拷贝到字符数组1中去。

例如,strcpy(str1, str2, 2); 即是将str2中前2个字符拷贝到str1中,然后再加一个′\0′。

5、strcat 字符串连接函数

(1)调用形式:strcat(字符数组1,字符数组2)

(2)功能:将字符数组2中字符串接到字符数组1中字符串的后面,结果放在字符数组1中,函数的返回值是字符数组1的地址。

(3)说明:字符数组1必须足够大,以便容纳连接后的新字符串。

6、strlen 字符串长度测试函数

(1)调用形式:strlen(字符串)

(2)功能:测试字符串的长度,函数的返回值为字符串的实际长度(不包括′\0′)。

7、strlwr 字符串转换函数

(1)调用形式:strlwr(字符串)

(2)功能:将字符串中大写字母转换成小写字母。

8、strupr 字符串转换函数

(1)调用形式:strupr(字符串)

(2)功能:将字符串中的小写字母转换成大写字母。

(二)字符数组与字符串应用

例1:输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。程序如下:#include

main( )

{ char string[81];

int i,num=0,word=0;

char c;

gets(string);

for(i=0;(c=string[i])!='\0';i++)

if(c= ='')

word=0;

else if(word= =0)

{ word=1; num++; }

printf("There are %d words in the line.\n",num);

}

例2:有3个字符串,要求找出其中最大者。程序如下:

main( )

{ char string[20], str[3][20];

int i;

for(i=0;i<3;i++) gets(str[i]);

if(strcmp(str[0],str[1])>0)

strcpy(string,str[0]);

else

strcpy(string,str[1]);

if(strcmp(str[2],string)>0)

strcpy(string,str[2]);

printf("\nthe largest string is∶\n %s\n",string);

}

_实验1分治法

实验一分治法 一、实验目的 1.理解分治法的方法; 2. 掌握使用分治法解决一般问题的步骤; 3. 掌握分治算法求解数组的最大值和最小值的方法。 二、实验原理 在一个给定数组中查找最大值和最小值是一类常见的问题,也是解决其他一些算法的基础。 假设给定数组为a,数组中含有n个元素,一般的算法是在数组中进行直接查找,算法伪代码如下: 1. x←a[0]; y←a[0] 2. for i←2 to n 3. if a[i]y then y←a[i] 5. end for 6. return (x,y) 上述代码在第3行和第4行涉及到元素的比较,每次循环进行2次比较,而循环的次数在算法第2行给出,为(n-2)+1=n-1次,因此,算法元素比较总次数为2(n-1)次。 现在采用分治的思想,假设数组的长度为2的整数幂,将数组分割成两半,分别为a[0…(n/2)-1]和a[n/2…n-1],在每一半中分别查找最大值和最小值,并返回这两个最小值中的最小值以及两个最大值中的最大值。 假设给定数组为a,数组的下标上界和下界分别为low和high,则其算法伪代码如下: minmax(a,low,high) 1. if high-low=1 then 2. if a[low]

(完整word版)数据结构第五章数组和广义表习题及答案

习题五数组和广义表 一、单项选择题 1.常对数组进行的两种基本操作是() A.建立与删除 B. 索引与修改 C. 查找与修改 D. 查找与索引2.对于C语言的二维数组DataType A[m][n],每个数据元素占K个存储单元,二维数组中任意元素a[i,j] 的存储位置可由( )式确定. A.Loc[i,j]=A[m,n]+[(n+1)*i+j]*k B.Loc[i,j]=loc[0,0]+[(m+n)*i+j]*k C.Loc[i,j]=loc[0,0]+[(n+1)*i+j]*k D.Loc[i,j]=[(n+1)*i+j]*k 3.稀疏矩阵的压缩存储方法是只存储 ( ) A.非零元素 B. 三元祖(i,j, aij) C. aij D. i,j 4. 数组A[0..5,0..6]的每个元素占五个字节,将其按列优先次序存储在起始地址为1000的内存单元中,则元素A[5,5]的地址是( )。 A. 1175 B. 1180 C. 1205 D. 1210 5. A[N,N]是对称矩阵,将下面三角(包括对角线)以行序存储到一维数组T[N(N+1)/2]中,则对任一上三角元素a[i][j]对应T[k]的下标k是()。 A. i(i-1)/2+j B. j(j-1)/2+i C. i(j-i)/2+1 D. j(i-1)/2+1 6. 用数组r存储静态链表,结点的next域指向后继,工作指针j指向链中结点,使j 沿链移动的操作为( )。 A. j=r[j].next B. j=j+1 C. j=j->next D. j=r[j]-> next 7. 对稀疏矩阵进行压缩存储目的是()。 A.便于进行矩阵运算 B.便于输入和输出 C.节省存储空间 D.降低运算的时间复杂度 8. 已知广义表LS=((a,b,c),(d,e,f)),运用head和tail函数取出LS中原子e的运算是( )。 A. head(tail(LS)) B. tail(head(LS)) C. head(tail(head(tail(LS))) D. head(tail(tail(head(LS)))) 9. 广义表((a,b,c,d))的表头是(),表尾是()。 A. a B.() C.(a,b,c,d) D.(b,c,d) 10. 设广义表L=((a,b,c)),则L的长度和深度分别为()。 A. 1和1 B. 1和3 C. 1和2 D. 2和3 11. 下面说法不正确的是( )。 A. 广义表的表头总是一个广义表 B. 广义表的表尾总是一个广义表 C. 广义表难以用顺序存储结构 D. 广义表可以是一个多层次的结构 二、填空题 1.通常采用___________存储结构来存放数组。对二维数组可有两种存储方法:一种是以___________为主序的存储方式,另一种是以___________为主序的存储方式。 2. 用一维数组B与列优先存放带状矩阵A中的非零元素A[i,j] (1≤i≤n,i-2≤j≤i+2),B 中的第8个元素是A 中的第_ _行,第_ _列的元素。

第 5 章 数组和广义表答案

第 5 章数组和广义表 一、选择 1.设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存 储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则 a85的地址为( B )。 A. 13 B. 33 C. 18 D. 40 2. 设有数组A[i,j],数组的每个元素长度为3字节,i的值为1 到 8 ,j的值为1 到10,数组从内存首地址BA开始顺序存放,当用以 列为主存放时,元素A[5,8]的存储首地址为(B )。 A. BA+141 B. BA+180 C. BA+222 D. BA+225 3. 假设以行序为主序存储二维数组A=array[1..100,1..100],设 每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=( B )。 A. 808 B. 818 C. 1010 D. 1020 4. 二维数组A的元素都是6个字符组成的串,行下标i的范围从0 到8,列下标j的范围从0到9。从供选择的答案中选出应填入下列 关于数组存储叙述中()内的正确答案。 (1)存放A至少需要( E )个字节; (2)A的第8列和第5行共占( A )个字节; (3)若A按行存放,元素A[8,5]的起始地址与A按列存放时的元 素( B )的起始地址一致。 供选择的答案: (1)A. 90 B. 180 C. 240 D. 270 E. 540

(2)A. 108 B. 114 C. 54 D. 60 E. 150 (3)A. A[8,5] B. A[4,9] C. A[5,8] D. A[0,9] 5. 若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括 主对角线上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中, 则在B中确定aij(i

[第1题-60题汇总]微软数据结构+算法面试100题

精选微软等公司数据结构 精选微软等公司数据结构++算法面试100题 -----[第1题-60题总] 资源说明: 此份,是为微软等公司数据结构+算法面试100题,之前60题的汇总。 总结整理了前第1题-第60题。特此并作此一份上传。以飨各位。:)。 -------------------------------- 相关资源,包括答案,下载地址: [答案V0.2版]精选微软数据结构+算法面试100题[前20题]--答案修正 https://www.360docs.net/doc/f06041933.html,/source/2813890 //此份答案是针对最初的V0.1版本,进行的校正与修正。 [答案V0.1版]精选微软数据结构+算法面试100题[前25题] https://www.360docs.net/doc/f06041933.html,/source/2796735 [第二部分]精选微软等公司结构+算法面试100题[前41-60题]: https://www.360docs.net/doc/f06041933.html,/source/2811703 [第一部分]精选微软等公司数据结构+算法经典面试100题[1-40题] https://www.360docs.net/doc/f06041933.html,/source/2778852 更多资源,下载地址: http://v_july_https://www.360docs.net/doc/f06041933.html,/ 很快,我将公布第21-40题的答案,敬请期待。:).. 如果你对以下的前第1-60题,有好的思路,和算法,欢迎跟帖回复, 或者,联系我,发至我的邮箱, zhoulei0907@https://www.360docs.net/doc/f06041933.html,。 My CSDN Blog:https://www.360docs.net/doc/f06041933.html,/v_JULY_v My sina Blog:https://www.360docs.net/doc/f06041933.html,/shitou009 帖子维护地址: [整理]算法面试:精选微软经典的算法面试100题[前1-60题] https://www.360docs.net/doc/f06041933.html,/u/20101023/20/5652ccd7-d510-4c10-9671-307a56006e6d.html -------------------------------------- July、2010、/11.12.请享用。:)。 1

数组运算法则

认识一维数组和二维数组。理清概念很重要,不要混淆数组、数组公式。 第一,一维数组和二维数组的定义 单行或单列的数组,我们称为一维数组。 多行多列(含2行2列)的数组是二维数组。 第二,数组和数组公式的区别 数组,就是元素的集合,按行、列进行排列。 数组公式:就是包含有数组运算的公式。ctrl+shift+enter,三键结束,这个过程就是告诉excel请与数组运算的方式来处理本公式,反馈一个信息,就是在公式的外面添加一对花括号。 第三,一维数组和二维数组的运算规律 1、单值x与数组arry运算 执行x与arry中每一个元素分别运算并返回结果,也就是与arry本身行列、尺寸一样的结果。 比如:2*{1,2;3,4;5,6},执行2*1、2*2、2*3……2*6运算,并返回3行2列的二维数组结果{2,4;6,8;10,12},如下图所示: 数组中行和列分别用逗号、分号来间隔。逗号表示行,行之间的关系比较紧密,用逗号分割;列之间,关系相对比较疏远一点,用分号分割。 又比如:"A"&{"B","C"}返回{"AB","AC"}。"A"={"B","A","C"}返回{FALSE,TRUE,FALSE} 2、同向一维数组运算 执行arry1与arry2对应位置的元素分别运算并返回结果。要求arry1与arry2尺寸必须相同,否则多余部分返回#N/A错误。 比如: {1;2;3}*{4;5;6}返回{4;10;18}; {1,2,3,4}*{4,5,6}返回{4,10,18,#N/A},如下图所示: 3、异向一维数组运算 arry1的每一元素与arry2的每一元素分别运算并返回结果,得到两个数组的行数*列数个元素,也就是M行数组与N列数组运算结果为M*N的矩阵数组。 比如:{1;2;3}*{4,5,6,7,8},执行1*4、1*5、……1*8、2*4、2*5……3*8,返回{4,5,6,7,8;8,10,12,14,16;12,15,18,21,24}

第五章 数组和广义表

第5章数组和广义表习题 一、选择题 1.设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为(B)。 i×(i-1)/2+j-1~~~~(i>=j) 8×7÷2+5=33因为a11从1开始所以要加1 A. 13 B. 33 C. 18 D. 40 2. 数组A[0..5,0..6]的每个元素占五个字节,将其按列优先次序存储在起始地址为1000的内存单元中,则元素A[5,5]的地址是( A)。 所求=a+(j*n+j)*l A. 1175 B. 1180 C. 1205 D. 1210 3. 若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中,则在B中确定aij(i

-实验1分治法

一、实验目的 1.理解分治法的方法; 2. 掌握使用分治法解决一般问题的步骤; 3. 掌握分治算法求解数组的最大值和最小值的方法。 二、实验原理 在一个给定数组中查找最大值和最小值是一类常见的问题,也是解决其他一些算法的基础。 假设给定数组为a,数组中含有n个元素,一般的算法是在数组中进行直接 循环的次数在算法第2行给出,为(n-2)+1=n-1次,因此,算法元素比较总次数为2(n-1)次。 现在采用分治的思想,假设数组的长度为2的整数幂,将数组分割成两半,分别为a[0…(n/2)-1]和a[n/2…n-1],在每一半中分别查找最大值和最小值,并返回这两个最小值中的最小值以及两个最大值中的最大值。 假设给定数组为a,数组的下标上界和下界分别为low和high,则其算法伪 接比较数组的两个元素,选出最大值和最小值,此为函数的递归终止条件;代码第7行和第8行是两个递归调用,分别在数组的下标范围[low,mid]和 [mid+1,high]查找最小值和最大值,第9行比较两个最大值取其中较大者,第10行比较两个最小值取较大者。

代码的第2、9和10行涉及到元素的比较,第7、8行由于递归也产生元素比较,因此令算法总的元素比较次数为C(n),则有 ???>+==2 2)2/(221)(n n C n n C 若若 对递推式进行求解 2 2/3 2 2)2/( 2)2(2 2 2...22)2/(2 ... 2 48)8/(824)2)8/(2(4 2 4)4/(42)2)4/(2(22)2/(2)(1 1122111-=-+=+=+++++==+++=+++=++=++=+=∑-=-----n n C n C n C n C n C n C n C n C k k j j k k k k k 得到minmax 算法的元素比较总次数为3n/2-2,优于直接比较的性能。 三、实验内容及要求 1. 编写程序使用分治算法MINMAX 求解数组的最小值和最大值,并用实际数组对算法进行测试。 2. 要求算法中元素比较的次数为3n/2-2,在程序中元素比较的地方进行记录,并在程序末尾输出数组最大值和最小值以及元素比较次数。 四、实验步骤 1. 定义结构体类型或类,用以在函数的返回值同时返回数组的最大值和最小值。

Python高频算法题100例-2019最新

Python高频算法题100例(2019) 1.二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 2.替换空格 题目:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 3.从尾到头打印链表 题目:输入一个链表,从尾到头打印链表每个节点的值。 4.重建二叉树 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 5.两个栈实现队列 题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。队列中的元素为int类型。 6.旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0 7.斐波那契数列

题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n 项。 8.跳台阶 题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 9.变态跳台阶 题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 10.矩形覆盖 题目:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 11.二进制中1的个数 题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 12.数值中的整数次方 题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 13.调整数组顺序使奇数位于偶数前面 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 14.链表中倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点。 15.反转链表

数据结构算法面试100题

数据结构+算法面试100题~~~摘自CSDN,作者July 1.把二元查找树转变成排序的双向链表(树) 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / / 6 14 / / / / 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。 首先我们定义的二元查找树节点的数据结构如下: struct BSTreeNode { int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // right child of node }; 2.设计包含min函数的栈(栈) 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。 要求函数min、push以及pop的时间复杂度都是O(1)。 参见C:\Users\Administrator\Desktop\demo\Stack 分析:min时间复杂度要达到O(1),需要我们在栈中存储最小元素 3.求子数组的最大和(数组) 题目: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。 分析:根据dp思想 #include #define N 8 int main() { int i, a[N] = {1, -2, 3, 10, -4, 7, 2, -5}; int from[N], result[N], max;

算法复习题-2015

算法分析与设计复习提纲 第一章算法引论 1、算法的定义以及五个特征 算法是完成特定任务的有限指令集,所有的算法都必须满足以下5个特征: 即,输入、输出、确定性、有限性、能行性或可行性。 2、算法与程序的主要区别 算法必须满足定义中的5个特征,而程序不需要满足5个特征中的(C) A.输入 B.确定性 C.有限性 D.能行性 3、算法的空间复杂度 算法的空间复杂度是指其运行所需的存储空间。程序运行所需的存储空间主要由两部分组成,即固定空间需求和可变空间需求。 4、算法的时间复杂度 算法的时间复杂度是指算法运行所需的时间,时间复杂度通常包括最好、最坏和平均时间复杂度。 5、在算法的时间复杂度分析中,其中比较容易分析和计算且最有实际价值的是(A) A.最坏时间复杂度 B.最好时间复杂度 C.平均时间复杂度 D.最好时间复杂度和最坏时间复杂度 6、程序步 一个程序步是指在语法上或语义上有意义的程序段,该程序段的执行时间必须与问题实例的规模无关。 7、给定的一个m次多项式,f(n)=a m n m+ a m-1n m-1+......+a1n+a0是m次多项式,且a m>0,则有 f(n)=O(n m)。 例如:若f(n)=3.6n3+2.5n2+3.8,则有f(n)=O(n3)。 8、多项式时间算法 凡可用多项式函数来对其计算时间限界的算法称为多项式时间算法。常用的多项式时间算法的时间复杂度可能为O(1),O(log2n),O(nlog2n),O(n3),O(n2),O(n)则给定的这六种多项时间算法的时间复杂度的大小关系为 O(1)

算法设计与分析课后习题

第一章 1. 算法分析题 算法分析题1-1 求下列函数的渐进表达式 (1). 3n^2 + 10n < 3n^2 + 10n^2 = 13n^2 = O(n^2) (2). n^2 / 10 + 2^n 当n>5是,n^2 < 2 ^n 所以,当n >= 1时,n^2/10 < 2 ^n 故: n^2/10 + 2^n < 2 ^n + 2^n = 2*2^n = O(2^n) (3). 21 + 1/n < 21 + 1 = 22 = O(1) (4). log(n^3)=3log(n)=O(log(n)) (5). 10log(3^n) = (10log3)n = O(n) 算法分析题1-6 (1)因为:f(n)=log(n^2) = 2log(n); g(n) = log(n) + 5 所以:f(n)=Θ(log(n)+5) =Θ(g(n)) (2)因为:log(n) < √n; f(n) = 2log(n); g(n)=√n 所以:f(n) = O(g(n)) (3)因为:log(n) < n; f(n) = n; g(n) = log(n^2) = 2log(n) 所以;f(n) = Ω(g(n)) (4)因为:f(n) = nlogn +n; g(n) = logn 所以:f(n) =Ω(g(n)) (5)因为: f(n) = 10; g(n) = log(10) 所以:f(n) =Θ(g(n)) (6)因为: f(n)=log^2(n); g(n) = log(n) 所以: f(n) ==Ω(g(n)) (7)因为: f(n) = 2^n < 100*2^n; g(n)=100n^2; 2^n > n ^2 所以: f(n) = Ω(g(n)) (8)因为:f(n) = 2^n; g(n) = 3 ^n; 2 ^n < 3 ^n 所以: f(n) = O(g(n)) 习题1-9 证明:如果一个算法在平均情况下的计算时间复杂性为Θ(f(n)),该算法在最坏情况下所需的计算时间为Ω(f(n)). 分析与解答: 因此,Tmax(N) = Ω(Tavg(N)) = Ω(Θ(f(n)))=Ω(f(n)). 第二章 算法分析题

第05章 数组

第五章数组二级全真习题 目的和要求: 1)掌握和数组的定义方法 2)掌握固定大小数组和动态数组的使用方法 3)尤其是动态数组的用法是二级考试的一个热点,几乎每年都要出现。 为此总结如下: 1)在静态数组中其下标只能是常量。不能为变量。而在动态数组中,开始声明时并未指出数组的大小(省略括号中的下标),当要使用它时,随时可用Redim 语句重新指出具体大小。也就是说在动态数组中Redim语句中的下标可以是常 量,也可以是变量,但这个变量必须是有了确定值的变量。 2)在过程中可多次使用Redim语句来改变数组的大小,也可改变数组的维数 3)每次使用Redim语句都会使原来数组中的值丢失,可以在Redim语句后加Preserve参数用来保留数组中的数据,但使用Preserve只能改变最后一维的大 小,且为最后一维的维上界(由于数组元素在内存中按列排列的缘故),前面几 维大小不能改变。使用Redim Preserve语句不可改变数组的维数或其他的维界, 例:dim a( ) as integer dim a ( ) as integer redim a(3) redim a(3) redim a(2,2)正确redim preserve a(2,2)语法错误 典型分析题: 1)选择题:(2000年春第27题)动静态数组知识点,(2003年秋)控件数组知识点2)程序填空题:(2003春第8题)综合考察了动态数组的定义、理解及其使用一.选择题 考点: 在选择题中,二级考题往往在数组定义中,考察对动态数组定义和数组维界的理解 如: 1.(2000年春27题) 下列语句中的___B__语句可以用来正确地声明一个动态数组 A. Private A(n) as integer B. Dim A() As Integer C. Dim A(,) as Integer D. Dim A(1 to n) 分析:该题明显的考察了对数组维界的理解。在VB中,对于固定大小的数组,维的上、下界必须是常数表达式,不可以是变量名。据此可以排除A、D.另如为固 定数组,则数组维数必须为确定值,排除c,B答案定义了一个动态数组,符合 题目意思。注:固定数组的维数可以为小数(四舍五入)如:dim c(6.6) as integer.===dim c(7) as integer 下同 2.(2001年秋29题) 以下有关数组的说明中,错误的____D____ A. 根据数组说明的方式,可将数组分为动态数组和静态数组 B. 在过程中,不能用private语句定义数组 C. 利用Redim语句重新定维时,不得改变已经说明过的数组的数据类型 D. 数组重新定维后,原有的数组元素内容将不予保留。 3(2002年春27题)下列有关数组的叙述中,错误的是____A__ A. 在过程中可以用Dim语句对形参数组进行声明 B. 数组是同类变量的一个有序集合 C. 数组元素可以是控件 D. 数组在使用之前,必须先用数组说明语句进行说明 4.(2003年春26题)下面有关数组处理的叙述中,不正确的是_______

数据库系统l试题库及答案 第5章数组和广义表

第5章 数组和广义表 5.1数组 一、填空题 1. 假设有二维数组A 6×8,每个元素用相邻的6个字节存储,存储器按字节编址。已知A 的起始存储位置 (基地址)为1000,则数组A 的体积(存储量)为 ;末尾元素A 57的第一个字节地址为 。 2. 三元组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素 的 、 和 。 3. 设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则 元素a[32,58]的存储地址为 。 4. 设n 行n 列的下三角矩阵A 已压缩到一维数组B[1..n*(n+1)/2]中,若按行为主序存储,则A[i,j] 对应的B 中存储位置为 。 5. 设有一个10阶对称矩阵A 采用压缩存储方式(以行为主序存储:a 11=1),则a 85 的地址为 。 6. 设下三角矩阵A 如果按行序为主序将下三角元素A i j (i ≤j)存储在一个一维数组B[1..n(n+1)/2]中, 对任一个三角矩阵元素A ij ,它在数组B 中的下标为 。 二、选择题 1. ( )假设有60行70列的二维数组a[1…60, 1…70]以列序为主序顺序存储,其基地址为10000, 每个元素占2个存储单元,那么第32行第58列的元素a[32,58]的存储地址为 。 A .16902 B .16904 C .14454 D .答案A, B, C 均不对 2. ( )对特殊矩阵采用压缩存储的目的主要是为了 。 A .表达变得简单 B .对矩阵元素的存取变得简单 C .去掉矩阵中多余元素 D .减少不必要的存储空间 3. ( )对于n 阶对称矩阵,如果以行序或列序放入内存中,则需要 个存储单元。 A .n(n+1)/2 B .n(n-1)/2 C . n 2 D .n 2 /2 4. 有一个100*90的稀疏矩阵,非0元素有10个,设每个整型数占2字节,则用三元组表示该矩阵时, 所需的字节数是 。 A. 60 B. 66 C. 18000 D. 33 5. 对稀疏矩阵进行压缩存储目的是( )。 A .便于进行矩阵运算 B .便于输入和输出 C .节省存储空间 D .降低运算的时间复杂度 6. ( )设矩阵A 是一个对称矩阵,为了节省存储,将其下三角部分(如下图所示)按行序存放在一 维数组B[1, n(n-1)/2 ]中,对下三角部分中任一元素a i,j (i ≤j), 在一维数组B 中下标k 的值是 。 A .i(i-1)/2+j-1 B .i(i-1)/2+j C .i(i+1)/2+j-1 D .i(i+1)/2+j 三、判断题: 1.( )一个稀疏矩阵Am*n 采用三元组形式表示,若把三元组中有关行下标与列下标的值互换,并把 ?????? ? ???????=n n n n a a a a a a A ,2,1 ,2,21,21,1Λ Λ

实验4(05) Java语言基础-数组

班级:姓名:学号:座位号 实验一:Java语言基础——数组 实验目的: 1.知道怎么样声明、创建和初始化各种类型的数组 2.理解二维数组的概念,能够声明、创建和初始化各种类型的二维数组 3.掌握对一维或二维数组元素的访问方法 4.掌握不规则二维数组的声明、创建和初始化以及访问的方法了解Arrays类及System 类中关于数组操作的方法的使用 实验内容 1.编写程序,掌握数组的声明和访问数组元素,了解数组对象length的作用 2.编写程序,掌握二维数组的定义和应用 3.编写程序,掌握二维不规则数组的定义和使用 4.编写程序,熟悉命令行参数 1.有如下数组 (1)声明并创建一个数组:src1,其内容为:1, 2, 3, 4, 5, 6 请用Arrays的copyOf方法复制该数组所有内容给另一数组dest1并输出dest1数组各元素。 import java.util.Arrays; public class One { public static void main(String[] args) { int src1[] = { 1, 2, 3, 4, 5, 6 }; int dest1[] = Arrays.copyOf(src1, src1.length); for (int j = 0; j < dest1.length; j++) { System.out.print(dest1[j] + " "); } System.out.println(); } } (2)声明并创建一个数组:src1,其内容为:1, 2, 3, 4, 5, 6 请用Arrays的copyOfRange 方法复制该数组所有内容给另一数组dest1并输出dest1数组各元素。 import java.util.Arrays; public class One { public static void main(String[] args) { int src1[] = { 1, 2, 3, 4, 5, 6 }; int []dest1 = Arrays.copyOfRange(src1, 0, src1.length); for (int j = 0; j < dest1.length; j++) { System.out.print(dest1[j] + " "); } System.out.println(); } }

数据结构练习题-数组和广义表

已知二维数组A[3][5],其每个元素占3个存储单元,并且A[0][0]的存储地址为1200。 求元素A[1][3]的存储地址(分别对以行序和列序为主序存储进行讨论),该数组共占用多少个存储单元? 【解答】按照以行序为主序存储公式: LOC(i,j)=LOC(c1,c2)+[(i-c1)*(d2-c2+1)+(j-c2)]*L 在C语言中有:LOC(i,j)=LOC(0,0)+(i*(d2+1)+j)*L 则: LOC(A[1][3])=1200+(1*5+3)*3=1224 (按行序存储) LOC(A[1][3])=1200+(3*3+1)*3=1230 (按列序存储) 有一个10阶的对称矩阵A,采用压缩存储方式以行序为主序存储,A[1][1]为第一元素,其存储地址为1,每个元素占一个地址空间,求A[7][5]和A[5][6]的地址。 【解答】按照公式: LOC(A[7][5])=7(7-1)/2+5 = 26 LOC(A[5][6])=LOC(A[6][5])=6(6-1)/2+5=20 设有一个二维数组A[m][n],设A[0][0]存放位置在644,A[2][2]存放位置在676,每个元素占一个空间,问A[3][3]存放在什么位置? 因为A[0][0]存放位置在644,A[2][2]存放位置在676,每个元素占一个空间,说明一行有15个元素(算法:(676-2-644)/2)。A[3][3]存放位置是692。 二维数组A[9][10]的元素都是6个字符组成的串,请回答下列问题: (1)存放A至少需要( )个字节; (2)A的第7列和第4行共占( )个字节; (3)若A按行存放,元素A[7][4]的起始地址与A按列存放时哪一个元素的起始地址一致。 【解答】按照题5.1给出的公式: (1)存放A需要9*10*6=540个字节 (2)A的第7列和第行共占(9+10-1)*6=108个字节(3) LOC(A[7][4])= LOC(A[0][0])+[7*10+4]*L (按行序存储) LOC(A[i][j])= LOC(A[0][0])+[j*9+i]*L (按列序存储,0<=i<=8,0<=j<=9)所以,i=2,j=8。 即元素A[7][4]的起始地址与A按列存放时A[2][8]的起始地址一致。 什么是广义表?请简述广义表和线性表的主要区别。 【解答】广义表是零至多个元素的有限序列,广义表中的元素可以是原子,也可以是子表。 从“元素的有限序列”角度看,广义表满足线性结构的特性:在非空线性结构中,只有一个 称为“第一个”的元素,只有一个称为“最后一个”的元素,第一元素有后继而没有前驱, 最后一个元素有前驱而没有后继,其余每个元素有唯一前驱和唯一后继。从这个意义上说, 广义表属于线性结构。当广义表中的元素都是原子时,广义表就蜕变为线性表。 求广义表D=(a,(b,(),c),((d),e))的长度和深度。 【解答】3和3

实验1(05) Java语言基础-数组_答案

班级:姓名:学号:成绩 实验一:Java语言基础——数组 实验目的: 1.知道怎么样声明、创建和初始化各种类型的数组 2.理解二维数组的概念,能够声明、创建和初始化各种类型的二维数组 3.掌握对一维或二维数组元素的访问方法 4.掌握不规则二维数组的声明、创建和初始化以及访问的方法了解Arrays 类及System类中关于数组操作的方法的使用 实验内容 1.编写程序,掌握数组的声明和访问数组元素,了解数组对象length的作 用 2.编写程序,掌握二维数组的定义和应用 3.编写程序,掌握二维不规则数组的定义和使用 4.编写程序,熟悉命令行参数 1.有如下数组 int myArray[] = { 1, 2, 3, 4, 5, 6 }; int yourArray[] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; 请利用System.arraycopy方法编写一个程序,复制myArray数组的所有内容到yourArray数组,放在yourArray数组下标0开始的位置,并输出yourArray数组的每个元素。

2.有整型数组,按顺序包含元素:10,7,9,2,4,5,1,3,6,8,请编写程序利用 Arrays.sort方法对数组进行排序,并输出该数组的每个元素。 3.互换二维数组的行列。

4.编写一个程序,连续输入5个整数,输出他们的平均数,并按格式输出每 个数和平均数的差值。(例如平均数为10,则输出格式如:5低于平均数5或11高于平均数1)。 5.利用二维数组存储并输出杨辉三角的前n(n的值自己指定)行。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1

算法试题

1 操作系统是算法吗?请说说算法和程序的区别。 答:不是。 算法是满足下述性质的指令序列: (1)输入:有零个或多个外部量作为算法的输入。 (2)输出:算法产生至少一个量作为输出。 (3)确定性:组成算法的每条指令清晰、无歧义。 (4)有限性:算法中每条指令的执行次数有限,执行每条指令的时间也有限 程序是算法用某种程序设计语言的具体实现。程序可以不满足算法的性质(4)即有限性。 2 关于描述时间复杂度的符号O Ωθ,请简要描述它们的含义。 答:O的定义:如果存在正的常数C和自然数N0,使得当N≥N0时有f(N)≤Cg(N),则称函数f(N)当N充分大时上有界,且g(N)是它的一个上界,记为f(N)=O(g(N))。即f(N)的阶不高于g(N)的阶。 Ω的定义:如果存在正的常数C和自然数N0,使得当N≥N0时有f(N)≥Cg(N),则称函数f(N)当N充分大时下有界,且g(N)是它的一个下界,记为f(N)=Ω(g(N))。即f(N)的阶不低于g(N)的阶。 θ的定义:定义f(N)= θ(g(N))当且仅当f(N)=O(g(N))且f(N)= Ω(g(N))。此时称f(N)与g(N)同阶。 3 算法A的运行时间至少是O(n2),这种说法正确吗?为什么? 答:不正确。因为时间复杂度的符号O描述的是函数具有上界,即最多的运行时间是O(n2)。 6、插入排序、合并排序和快速排序这三种算法,哪几种使用了分治策略?请简述之。答:合并排序和快速排序使用了分治的策略。 合并排序:对要排序的数组A[low…high],令mid=[(low+high)/2],用A[mid]把原数组A[low…high]分成两个子数组,然后对两个子数组进行排序,在合并两个已牌子徐的子数组,产生排序数组。 快速排序:对要排序的数组A[low…high],先使用算法SPLIT重新排列元素,使得原先在A[low]中的祝愿占据其正确的位置A[w],并且所有小于或等于A[w]的元素所处的位置为A[low…w-1],而所有大于A[w]的元素所处的位置是A[w+1…high]。在对子数组A[low…w-1]和A[w+1…high]递归地排序,产生整个排序数组。 归并排序要好于插入排序,插入排序要好于冒泡排序。 7、分治法适合求解的问题一般具有那些特征?分治法可分为哪三个主要步骤? 答:适合分治法求解的问题一般具有以下特征: (1)问题的规模缩小到一定程度就可以容易地解决 (2)问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质 (3)基于子问题的解可以合并为原问题的解 (4)问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 分治法可分为以下三个步骤: 分解(Divide):将原问题分解为子问题 解决(Conquer):求解子问题 合并(Combine):组合子问题的解得到原问题的解。 分治法的基本思想: 分治法的基本思想是将规模较大的问题分解为规模较小的子问题,子问题之间相互独立且与原问题同类。求解子问题,然后将子问题的解合并为原问题的解。 分治法的求解实例:

05-课件:一维数组的输入输出

一维数组的输入输出 例:打印所有大于平均数的值#include #define N 10 int main() { int a[N],sum=0; float average; for(int i=0; iaverage)/*找数并输出*/ printf("%d ",a[j]); } }

一维数组的输入输出 对数组中任意元素的独立访问对整个数组的访问 ?数组输入输出的问题for(int i =0; i

一维数组的输入输出对整个数组的访问?数组输入输出的问题 for(int j=0; javerage) printf("%d ",a[j]); } 34569 对数组整个元素进行 输入输出时,可以按 下标控制,也可以整 体操作。 例:char a[20] 可以有: scanf(“%s”,a); printf(“%s”,a); 下标控制是关键

一维数组的输入输出 ?简单应用例:反向输出数组中各元素的值#include main() {int a[5]={10,20,30,40,50};int i=5; while (--i >=0) printf("\ta[%d]=%d\t",i,a[i]);}期待的输出结果:a[4]=50 a[3]=40 a[2]=30 a[1]=20 a[0]=10控制下标是关键

相关文档
最新文档