第4章 串与数组 习题参考答案

巡山小妖精
900次浏览
2021年02月11日 03:52
最佳经验
本文由作者推荐

-

2021年2月11日发(作者:如果爱早点说出来)


习题四



参考答案



一、选择题



1


.下面关于串的叙述中,哪一个是不正确的?(



B








A


.串是字符的有限序列





B


.空串是由空格构成的串





C


.模式匹配是串的一种重要运算





D


.串既 可以采用顺序存储,也可以采用链式存储



2


.串的长度是指


(



A




)


A.


串中包含的字符个数














B.


串中包含的不同字符个数



C.


串中除空格以外的字符个数








D.


串中包含的不同字母个数



3


.设有两个串


p



q


,其中


q



p


的子串,求


q


p


中首次出现的位置的算法称为(




C






A


.求子串



B


.联接



C


.模式匹配



D


.求串长



4


.设主串的长度为


n


,模式串的长度 为


m


,则串匹配的


KMP


算法时间复杂度是


(



C




)








A.



O(m)







B.



O(n)







C.



O(n + m)









D.



O(n


×


m)


5.


串也是一种线性表,只不过


(



A




)




A.


数据元素均为字符


















B.


数据元素是子串








C.


数据元素数据类型不受限制










D.


表长受到限制



6.

< br>设有一个


10


阶的对称矩阵


A< /p>


,采用压缩存储方式,


以行序为主进行存储,

a


11


为第一元素,


其存储地址为


1


,每个元素占一个地址空间,则


a< /p>


85


的地址为(


B





A. 13










B. 33











C. 18










D. 40


7.


有一个二维数组


A[1..6, 0..7]



每个数组元素用相邻的


6


个 字节存储,


存储器按字节编址,


那么这个数组占用的存储空间大 小是(



D




)个字节。







A. 48










B. 96











C. 252










D. 288


8.



设有数组


A[1..8,1..10]


,数组的每个元素占


3


字节,数组从内存首地址


BA


开始以列 序


为主序顺序存放,则数组元素


A[5



8]


的存储首地址为


( B )




A. BA+141 B. BA+180 C. BA+222 D. BA+225


9.


稀疏矩阵的三元组存储表示方法


( B )


A.


实现转置操作很简单,只需将每个三元组中行下标和列下 标交换即可



B.


矩阵的非零元素个数和位置在操作过程中变化不大时较有效



C.


是一种链式存储方法



D.


比十字链表更高效



10.


用十字链表表示一个稀疏矩阵,每个非零元素一般用一个含有


( A )


域的结点表示。



A.5 B.4 C. 3 D. 2


二、填空题



1.


一个串的任意连续字符组成的子序列称为串的



子串



,该串称为



主串





2


.串长 度为


0


的串称为



空串



,只包含空格的串称为



空格串





3.


若两个串的长度相等且对应位置上的字符也相等,则称两个串



相等





4.


寻找子串在主串中的位置,称为



模式匹配



。其中,子串又称为



模式串





5.


模式串


t=



next[]


数组值为



-1001231


< br>,


nextval[]


数组值为



-10-10-130





6.


设 数组


A[1..5,1..6]


的基地址为

1000


,每个元素占


5


个存储单 元,若以行序为主序顺序


存储,则元素


A[5,5]

< p>
的存储地址为



1140





7


.在稀 疏矩阵的三元组顺序表存储结构中,除表示非零元的三元组表以外,还需要表示矩


阵的行 数、列数和



非零元个数





8


.一个


n


×


n


的对称 矩阵,如果以相同的元素只存储一次的原则进行压缩存储,则其元素压


缩后所需的存储容 量为


n(n+1)/2




9


.对矩阵压缩的目的是为了



节省存储空间





10.


稀 疏矩阵一般采用的压缩存储方法有两种,即



三元组





十字链表





三、算法设计题



1




编写基 于


SeqString


类的成员函数


c ount(),


统计当前字符串中的单词个数。



参考答案


:


public int count() {


int wordcount = 0; //


单词个数



char currChar, preChar;


for (int i = 1; i < (); i++) {


currChar = (i); //


当前字符



preChar = (i - 1); //


前一个字符



if (((int) (currChar) < 65 || (int) (currChar) > 122


//


当前字符不是字母



|| ((int) (preChar) > 90 && (int) (preChar) < 97))


&& (((int) (preChar) >= 65 && (int) (preChar) <= 90)


//


当前字符的前一个字符是字母



|| ((int) (preChar) >= 97 && (int) (preChar) <= 122))) {


wordcount++;


}


}


return wordcount;


}



2




编写基 于


SeqString


类的成员函数


r eplace(begin,s1,s2)



要求在当前对象串 中,


从下



begin


开始,将所有的


s1


子串替换为


s2


串。



参考答案


:


//begin int


开始位置


;s1 String


原始字符串


; s2 String


目标字符串


;


public SeqString replace(int begin, SeqString s1, SeqString s2) {


if (s1 == null || s2 == null) {


return null;


}


SeqString ss = new SeqString(


产生空串



SeqString source = this;


int index = -1;


while ((index = f(s1, begin)) != -1) {


(ing(0, index)); //


串连接



(s2);


source = (SeqString) ing(index + ());


//


取子串



}


(source); //


串连接



return ss;


}


3




编写基 于


SeqString


类的成员函数


r everse()


。要求将当前对象中的字符反序存放。



参考答案


:


public SeqString reverse() {


for (int i = 0, j = () - 1; i < j; i++, j--) {


char temp = (i);


setCharAt(i, (j));


setCharAt(j, temp);


}


return this;


}


4




编写基 于


SeqString


类的成员函数


d eleteallchar(ch)


。要求从当前对象串中删除其值

等于


ch


的所有字符。



参考答案


:


public SeqString deleteAllChar(char ch) {


SeqString s1 = new SeqString(f(ch));


if (s1 == null) {


return null;


}


SeqString ss = new SeqString(


产生空串



SeqString source = this; //


当前串赋值到


sourse


int index = -1;


while ((index = f(s1, 0)) != -1) {


(ing(0, index)); //


串连接



source = (SeqString) ing(index + 1); //


取子串



}


(source); //


串连接



return ss;


}



5




编写基 于


SeqString


类的成员函数


s tringcount(str)



要求统计子串


str


在当前对象串


中出现的次数,若不出现则返回


0




参考答案


:


public int stringCount(SeqString str) {


SeqString source =


int count = 0, begin = 0;


int index;


while ((index = f(str, begin)) != -1) {


count++;


begin = index + ();


}


return count;


}


6




鞍点是 指矩阵中的元素


a


ij


是第

< p>
i


行中值最小的元素,同时又是第


j


列中值最大的元素。


试设计一个算法求矩阵


A


的所有鞍点。



参考答案


:


//


存放矩阵中鞍点的类



class Result {


TripleNode data[]; //


三元组表,存放鞍点的行、列、值



int nums; //


鞍点个数



public Result(int maxSize) { //


构造方法



data


=


new


TripleNode[maxSize]; //


为顺序表 分配


maxSize


个存储单元



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


data[i] = new TripleNode();


}



nums = 0;


}


}


//


返回矩阵中的所有鞍点



public Result allSaddlePoint(int[][] ar) {


int i, j, flag, m, n;


Result re = new Result();


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


m = i;


n = 0;


flag = 1; //


假设当前结点是鞍点



for (j = 0; j < ar[i].length; j++) {


if (ar[i][j] < ar[m][n]) {


n = j;


}


}


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


if (ar[j][n] > ar[m][n]) {


flag = 0; //


不是鞍点



}


}


if (flag == 1) { //


是鞍点,将其加入



[] = new TripleNode(m, n, ar[m][n]);


++;


}


}


return re;


}


7




设计算 法,求出二维数组


A[n,n]


的两条对角线元素之和



参考答案


:


public static int sumOfDiagonal(int[][] a) {


int i, n = a[0].length, sum1 = 0, sum2 = 0, sum;


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


sum1 += a[i][i]; //


主对角线之和



sum2 += a[i][n - i - 1]; //


副对角线之和



}


sum = sum1 + sum2;


if (n % 2 == 1) { //


若矩阵行数为奇数,则减去两条对角线相交的元素。



sum -= a[n / 2][n / 2];


}


return sum;


}



四、上机实践题



1.


在顺序串类


SeqString


中增加一个主函数, 测试各成员函数的正确性。



参考答案


:


package ch04Exercise;


import ing;


public class Exercise4_4_1 extends SeqString{


public static void main(String args[]) {


char[] chararray = {'W', 'o', 'r', 'l', 'd'};


SeqString s1 = new SeqString(); //


构造一个空串



SeqString s2 = new SeqString(


以字符串常量构造串对象



SeqString s3 = new SeqString(chararray); //


以字符数组构造串对象



n(



s1=


(0, s2);


n(


< br>s1


在第


0


个字符前插入串


s2



,s1=


(1, s3);


n(


< br>s1


在第


1


个字符前插入串


s3



,s1=


(1, 4);


n(


s1


删除第


1


到第


3


个字符后


,s1=


n(



s1


中从第

2


到第


5


个字符组成的子串是:< /p>



ing(2, 6));


}


}


运行结果


:




2.


已 知两个稀疏矩阵


A



B


,试基于三元组顺序表或十字链表的存储结构,编程实现


A+B


的运算。



参考答案


:


package ch04Exercise;


import Matrix;


public class Exercise4_4_2 {


public static SparseMatrix addSMatrix(SparseMatrix a, SparseMatrix b) {


//


计算两个三元组表示的稀疏矩阵之和



if (s() != s() || s() != s()) {


n(


这两个矩阵不能相加



return null;


}


SparseMatrix c = new SparseMatrix(s() + s());


int i = 0, j = 0, k = 0;


int len=0;


while (i < s() && j < s()) {


if (a()[i].getRow() < a()[j].getRow()) { //A

< p>





a()[k].setColumn(a()[i].getColumn());


a()[k].setRow(a()[i].getRow());


a()[k].setValue(a()[i].getValue());


s(++k);


i++;


} else if (a()[i].getRow() == a()[j].getRow()) { // A


行号


=B


行号



if


(a()[i].getColumn()


==


a()[j].getColumn())


{ //A



=B




if


(a()[i].getValue()


+


a()[j].getValue()


!=


0)


{


a()[k].setColumn(a()[i].getColumn());


a()[k].setRow(a()[i].getRow());

-


-


-


-


-


-


-


-