加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

串和数组题目及答案

(2011-12-09 14:50:16)
标签:

杂谈

一、填空题(每空1分,共20分)

1  不包含任何字符(长度为0的串  称为空串;    由一个或多个空格(仅由空格符)组成的串    称为空白串。

(对应严题集4.1①,简答题:简述空串和空格串的区别)

 

2. S=A;/document/Mary.doc”,则strlen(s)=    20      “/”的字符定位的位置为     3    

 

4子串的定位运算称为串的模式匹配; 被匹配的主串    称为目标串,  子串   称为模式。

 

5. 设目标T=”abccdcdccbaa”,模式P=cdcc”,则第     次匹配成功。

 

6. n为主串长,m为子串长,则串的古典(朴素)匹配算法最坏的情况下需要比较字符的总次数为  (n-m+1)*m  

 

7. 假设有二维数组A6×8,每个元素用相邻的6个字节存储,存储器按字节编址。已知A的起始存储位置(基地址)为1000,则数组A的体积(存储量)为    288 B   ;末尾元素A57的第一个字节地址为   128    ;若按行存储时,元素A14的第一个字节地址为  (8+4)×6+1000=1072    ;若按列存储时,元素A47的第一个字节地址为  (6×74)×61000)=1276     

(注:数组是从00列还是从11列计算起呢?由末单元为A57可知,是从00列开始!)

 

8. 00年计算机系考研题〗设数组a[160, 170]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为   8950

      

答:不考虑00列,利用列优先公式: LOC(aij)=LOC(ac1c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L

得:LOC(a32,58)=2048+[(58-1)*(60-1+1)+32-1]]*28950

 

 

 

9. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素

   行下标      列下标        元素值      

 

10.求下列广义表操作的结果:

1) GetHead((a,b),(c,d))===   (a, b)           //头元素不必加括号

2) GetHeadGetTail((a,b),(c,d))】】===  (c,d)     ;

3) GetHeadGetTailGetHead((a,b),(c,d))】】】===   b   ;

4) GetTailGetHeadGetTail((a,b),(c,d))】】】===   d)      ;

 

二、单选题(每小题1分,共15分)

( B  1. 〖李〗串是一种特殊的线性表,其特殊性体现在:

   A.可以顺序存储       B.数据元素是一个字符      

C.可以链式存储        D.数据元素可以是多个字符

 

( B  2. 〖李〗设有两个串pq,求qp中首次出现的位置的运算称作:

   A.连接      B.模式匹配    C.求子串       D.求串长

 

(  3. 〖李〗设串s1=’ABCDEFG’s2=’PQRST’,函数con(x,y)返回xy串的连接串,subs(s, i, j)返回串s的从序号i开始的j个字符组成的子串,len(s)返回串s的长度,则con(subs(s1, 2, len(s2)), subs(s1, len(s2), 2))的结果串是:

   A.BCDEF       B.BCDEFG     C.BCPQRST        D.BCDEFEF

解:con(x,y)返回xy串的连接串,即 con(x,y)=‘ABCDEFGPQRST’;

subs(s, i, j)返回串s的从序号i开始的j个字符组成的子串,则

subs(s1, 2, len(s2))subs(s1, 2, 5)=’ BCDEF’;  subs(s1, len(s2), 2)subs(s1, 5, 2)=’ EF’;

所以con(subs(s1, 2, len(s2)), subs(s1, len(s2), 2))con(’ BCDEF’, ’ EF’)之连接,即BCDEFEF

 

(  4. 01年计算机系考研题〗假设有6070列的二维数组a[160, 170]以列序为主序顺序存储,其基地址为10000,每个元素占2个存储单元,那么第32行第58列的元素a[32,58]的存储地址为      。(无第0行第0列元素)

   A.16902    B.16904      C.14454       D.答案A, B, C均不对

答:此题与填空题第8小题相似。(57列×60行+31行)×2字节+10000=16902

 

 B   )5设矩阵A是一个对称矩阵,为了节省存储,将其下三角部分(如下图所示)按行序存放在一维数组B[ 1, n(n-1)/2 ]中,对下三角部分中任一元素ai,j(ij), 在一维数组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

串和数组题目及答案

6. 91初程P78 从供选择的答案中,选出应填入下面叙述   ?   内的最确切的解答,把相应编号写在答卷的对应栏内。

有一个二维数组A,行下标的范围是08,列下标的范围是15,每个数组元素用相邻的4个字节存储。存储器按字节编址。假设存储数组元素A[0,1]的第一个字节的地址是0

存储数组A的最后一个元素的第一个字节的地址是  。若按行存储,则A[3,5]A[5,3]的第一个字节的地址分别是       。若按列存储,则A[7,1]A[2,4]的第一个字节的地址分别是        

供选择的答案:

AE:①28   ② 44   ③ 76   ④ 92    ⑤ 108

⑥ 116   ⑦ 132   ⑧ 176    ⑨ 184   ⑩ 188

答案:ABCDE=8,  3,  5,  1,  6

 

7.94P12 有一个二维数组A,行下标的范围是16,列下标的范围是07,每个数组元素用相邻的6个字节存储,存储器按字节编址。那么,这个数组的体积是     个字节。假设存储数组元素A[1,0]的第一个字节的地址是0,则存储数组A的最后一个元素的第一个字节的地址是     。若按行存储,则A[2,4]的第一个字节的地址是    。若按列存储,则A[5,7]的第一个字节的地址是    

供选择的答案

AD:①12   ② 66   ③ 72   ④ 96    ⑤ 114   ⑥ 120

    ⑦ 156   ⑧ 234     ⑨ 276   ⑩ 282    11283   12288

答案:ABCD=12,  10,    3,  9

 

三、简答题(每小题5分,共15分)

1.  【其他教材】KMP算法的设计思想是什么?它有什么优点?

答:其设计思想是,利用已经部分匹配的结果来加快模式串的滑动速度

主要优点有二:一是在模式与主串已经部分匹配的情况下,可以大大加快匹配速度;二是主串指针不回溯,可以使外设文件边读入边匹配。

 

2. 【其他教材】已知二维数组Am,m采用按行优先顺序存放,每个元素占K个存储单元,并且第一个元素的存储地址为Loc(a11),请写出求Loc(aij)的计算公式。如果采用列优先顺序存放呢?

解:公式教材已给出,此处虽是方阵,但行列公式仍不相同;

按行存储的元素地址公式是: Loc(aij)Loc(a11) +[ (i-1)*m+(j-1) K

按列存储的元素地址公式是: Loc(aij)Loc(a11) +[ (j-1)*m+(i-1) K

 

3.【全国专升本资格考试】递归算法比非递归算法花费更多的时间,对吗?为什么?

答:不一定。时间复杂度与样本个数n有关,是指最深层的执行语句耗费时间,而递归算法与非递归算法在最深层的语句执行上是没有区别的,循环的次数也没有太大差异。仅仅是确定循环是否继续的方式不同,递归用栈隐含循环次数,非递归用循环变量来显示循环次数而已。

 

四、计算题(每题5分,共20分)

1. s=’I AM STUDENT’, t=’GOOD’, q=’WORKER’, Replace(s,’STUDENT’,q) 

Concat(SubString(s,6,2), Concat(t,SubString(s,7,8)))

解:① Replace(s,’STUDENT’,q)’I AM WORKER’

 

 

② 因为  SubString(s,6,2)=‘A ’;SubString(s,7,8)=‘ STUDENT

Concat(t,SubString(s,7,8))’GOOD STUDENT’

所以Concat(SubString(s,6,2), Concat(t,SubString(s,7,8)))=‘A GOOD STUDENT

 

2. 【严题集4.8②】 已知主串s=’ADBADABBAABADABBADADA’,模式串pat=’ADABBADADA。写出模式串的nextval函数值,并由此画出KMP算法匹配的全过程。

解:(由演示程序得知)nextval函数值为  在第12个字符处发现匹配!

s=’ADBADABBAABADABBADADA’

pat=’ADABBADADA

 

 

3. P60 4-18)用三元组表表示下列稀疏矩阵:

串和数组题目及答案         串和数组题目及答案

解:参见填空题4. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的   行下标      列下标        元素值      

所以(1)可列表为:                     2)可列表为:

8

8

串和数组题目及答案5

3

2

3

3

6

8

5

4

6

7

8

5

8

1

2

 

 

4. P60 4-19)下列各三元组表分别表示一个稀疏矩阵,试写出它们的稀疏矩阵。

串和数组题目及答案         串和数组题目及答案

解:(1)为6×4矩阵,非零元素有6个。   2)为4×5矩阵,非零元素有5

串和数组题目及答案串和数组题目及答案

 

 

 

 

 

 

 

 

 

五、算法设计题(每题10分,共30分)

1. 【严题集4.12③】 编写一个实现串的置换操作Replace(&S, T, V)的算法。

解:

int Replace(Stringtype &S,Stringtype T,Stringtype V);//将串S中所有子串T替换为 

V,并返回置换次数 

  for(n=0,i=1;i<=Strlen(S)-Strlen(T)+1;i++) //注意i的取值范围 

    if(!StrCompare(SubString(S,i,Strlen(T)),T)) //找到了与T匹配的子串 

    //分别把T的前面和后面部分保存为headtail 

      StrAssign(head,SubString(S,1,i-1)); 

      StrAssign(tail,SubString(S,i+Strlen(T),Strlen(S)-i-Strlen(T)+1)); 

      StrAssign(S,Concat(head,V)); 

      StrAssign(S,Concat(S,tail)); //head,V,tail连接为新串 

      i+=Strlen(V); //当前指针跳到插入串以后 

      n++; 

      n++; 

    }//if 

  return n; 

}//Replace

分析:i+=Strlen(V);这一句是必需的,也是容易忽略的.如省掉这一句,则在某些情况下会引起不希望的后果,虽然在大多数情况下没有影响.请思考:S='place', T='ace', V='face',则省掉i+=Strlen(V);运行时会出现什么结果?

 

2. 【全国专升本资格考试】写出将字符串反序的递归递推算法,例如字符串为“abcsxw”,反序为“wxscba(注:这也是严题集4.10 编写对串求逆的递推算法)

请注意递归和递推的区别!递推是由递进;  递归是由嵌套。

 

算法思路:

① 假定用单链表结构存储字符串;

if没有到尾部字符就不停调用自身函数,直至到达末尾,再从尾部返回并打印字符;

串和数组题目及答案否则就打印当前字符并返回。

Invert(stringlistnode *p){

if(!p)return(0);

else Invert(p->next);

printf(“%c”, p->data)

}

如果当前串长为0,return(-1)

否则开始递归:

if  串没有到末尾,则P=P->next; 再调用invert(s);

else printf(p->data);

return

 

严题集4.10答案:

void String_Reverse(Stringtype s,Stringtype &r)//s的逆串

  StrAssign(r,''); //初始化r为空串 

  for(i=Strlen(s);i;i--) 

  

    StrAssign(c,SubString(s,i,1)); 

    StrAssign(r,Concat(r,c)); //s的字符从后往前添加到r中   /这是递推算法。

  

}//String_Reverse

 

3. 【严题集5.18试设计一个算法,将数组A中的元素A[0]A[n-1]循环右移k位,并要求只用一个元素大小的附加存储,元素移动或交换次数为O(n)

解:

分析:要把A的元素循环右移k,A[0]移至A[k],A[k]移至A[2k]......直到最终回到A[ 0].然而这并没有全部解决问题,因为有可能有的元素在此过程中始终没有被访问过,而是被跳了过去.分析可知,nk的最大公约数为p,只要分别以A[0],A[1],...A[p-1]为起点执行上述算法,就可以保证每一个元素都被且仅被右移一次,从而满足题目要求.也就是说,A的所有元素分别处在p"循环链"上面.举例如下

n=15,k=6,p=3. 

第一条链:A[0]->A[6],A[6]->A[12],A[12]->A[3],A[3]->A[9],A[9]->A[0].  /已“顺便”移动了A[6]A[12]

第二条链:A[1]->A[7],A[7]->A[13],A[13]->A[4],A[4]->A[10],A[10]->A[1]. 

第三条链:A[2]->A[8],A[8]->A[14],A[14]->A[5],A[5]->A[11],A[11]->A[2]. 

恰好使所有元素都右移一次

虽然未经数学证明,但作者相信上述规律应该是正确的程序如下:

void RSh(int A[n],int k)//把数组A的元素循环右移k,只用一个辅助存储空间 

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

    if(n%i==0&&k%i==0) p=i;//nk的最大公约数

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

  

    j=i;l=(i+k)%n;temp=A[i]; 

    while(l!=i) 

    

      A[j]=temp; 

      temp=A[l]; 

      A[l]=A[j]; 

      j=l;l=(j+k)%n; 

    }// 循环右移一步 

    A[i]=temp; 

  }//for

}//RSh 

 

 

附加题: 利用C的库函数strlen, strcpy(或strncpy)写一个算法void StrDelete(char *S,int t,int m) ,删除串S中从位置i开始的连续的m个字符。若istrlen(S),则没有字符被删除;若i+mstrlen(S),则将S中从位置i开始直至末尾的字符均被删去。

提示:strlen是求串长(length)函数:int strlen(char s);  //求串的长度

strcpy是串复制(copy)函数:char *strcpy(char to,char from); //该函数将串from复制到串to中,并且返回一个指向串to的开始处的指针。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有