牛客刷题笔记--(字符串专项练习)

知识点

串长度是指串中所有字符的个数 ,空格也算
字符串的每个元素始终都是字符(char),而不会是别的类型
空串中存放的都是NULL;空格串中存放的是空格,是有长度的
字符串的长度是串中字符个数,在C++中汉字算两个,在java中汉字算一个
字符串若要相等:长度必须相等,对应位置的字符也相等!
子串定义:串中任意个连续的 字符 组成的子序列

1 判断下述语句的对错:MFC中CString是类型安全的类 (√)
==类型安全就是说,如果两个类型直接要相互转换,必须要显示的转换,不能偷偷摸摸的只用一个等于号就隐式转换了 ==

类型安全不是一种类型,是有关类型操作一种规范。
如:不让不同类型的数据相互转换
int Num =3;
string Str=“3”;
Num =Str; //错
Num=int.Parse(Str);//对
类型安全要求可以相互转换的不同类型数据在转换时 显式转换
MFC数据类型转换标准库std的string 和MFC类库CString之间可以通过CString的format方法进行转换

2 程序的输出结果是 B

main( ) 
{ 
    char c1,c2; 
    c1 ='C'+'8''3';
    c2 ='9''0';
    printf("%c %d\n",c1,c2); 
}
H'9'

H 9

F'9'

表达式不合法输出无定值

字符要加单引号,当数字不加单引号赋给字符时,代表的是ASCII值,当加上单引号时,单引号里的内容就是字符,是数字时,那么该数字字符的ASCII就相当于该数字,如果把数字字符用整数输出,就直接输出该数

string 和 int 型都支持直接加减
‘C’+‘8’-‘3’= ‘C’+‘5’,由于’C’+1=‘D’,所以结果为char ‘H’ => %c;
‘9’-‘0’:平时写代码的时候经常int(0~9)转换char就用的+‘0’,因此结果直接就是int 9 => %d。

3 某字符串满足:concat(head(s),head(tail(tail(s))))=“ac”,(head,tail的定义同广义表),则S=©

aabc

acba

accc

acac

概念解释:广义表L=(A,B,C),表头是A,表尾是(B,C),这是定义。
tail()表示取字符串的尾部,head()表示取字符串的头,concat()表示字符串拼接。
取两次尾部一次头部,然后合并,答案是C。
对于广义表的head和tail的理解了,head是第一个元素,tail是除了第一个元素的余下的。如果只有一个那么尾部是空

4 设有两个串S1和S2,求S2在S1中首次出现的位置的运算称作()

求子串

判断是否相等

模型匹配

连接

类似于KMP算法,在一个大的字符串中匹配小字符串

5 C++里,下面选项中合法的字符常量是?B

"X"

'X'

'abc'

'\'

字符常量是用单引号括起来的一个字符。A选项中,使用双引号标示字符串常量,所以是错误的;C选项中,‘abc’是字符串,字符常量只能是单个字符,不能使字符串;D选项中,以反斜杠"“开头的是转义字符。因此B选项正确。
字符串常量:以双引号引起来的数据,如"he123” “a”。字符常量:以单引号引起的一个字符,如’a’ ‘\n’。

6 以下程序段的输出结果是 A

char s[]="\\123456\123456\t";
printf("%d\n",strlen(s));
12

13

16

以上都不对

应该是 12位
\ 表示
\123 表示 S
\t 是制表符
都占用一位
所以一共是12位

7 二维数组和多维数组均不是线性结构。(√ )

线性结构是一个有序数据元素的集合。 其中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。
常用的线性结构有:线性表,栈,队列,双队列,数组,串。
非线性结构中各个数据元素不再保持在一个线性序列中,每个数据元素可能与零个或者多个其他数据元素发生联系。根据关系的不同,可分为层次结构和群结构。
常见的非线性结构有:二维数组,***数组,广义表,树(二叉树等),图。(其中***数组是由多个一维数组组成的,所以不再是线性结构)
二维数组就是一种非线性结构(因为是一对多的关系了:a[0]对应两个:a[0][0]、a[0][1])

一维数组是线性结构,二维及***不是线性结构。
线性结构是一个数据元素的有序集合,是指数据元素之间存在“一对一”的关系。
一维数组的下标,只能对应一个元素,属于线性结构。
二维及***数组,可用矩阵来表示,他们都是两个或多个下标值对应一个元素,是多对一的关系,因此是非线性结构。

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

串是字符的有限序列

空串是由空格构成的串

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

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

长度为零的串,即“”,叫空串;而空格组成的串叫空格串。故选B
空串和空格串的区别。空格也是一种字符

9 设S为一个长度为n的字符串,其中的字符各不相同,则S中的互异的非平凡子串(非空且不同于S本身)的个数为(D)

2n-1(/2)+(n/2)

(/2)+(n/2)-1

(/2)-(n/2)-1

其他情况
 【解析】 题目说了一大堆,其实就是为了求字符串的非空真子串吗!字符串的子串,就是字符串中的某一个连续片
 段。截取一个字符串长度需要一个起始位置和结束位置。举个例子:“software”有8个字符,可是设置间隔的位置
 有9个,使用C(9,2)=36即可求得“software”的所有非空子串。因为一般情况下,我们也认为空串也是子串,故还
 需要加上1,总共37个子串。

含有n个不同字符的字符串的非空子串的个数为C(n + 1, 2) = n * (n + 1) / 2 
子串(包括空串)为 n * (n + 1) / 2 + 1 
非空真子子串(不包括空串和跟自己一样的子串)为 n *(n + 1/ 2 - 1 
 算第一个字母开头的, 有n个 (其中包括s本身)
第二次字母开头的, n-1个
一直到1个

n + (n-1) + ....  + 1 = n(n+1) / 2 
然后 减去一个 s本身 

10 KMP算法的特点是在模式匹配时指示主串的指针不会变小(√)
KMP算法最大的特点就是指示主串的指针不需要回溯,因此指针不可能变小
KMP算法的改进在于:每当一趟匹配过程中出现字符比较不相等时,不需回溯主串指针,而是利用已经得到的“部分匹配”的结果将模式向右“滑动”尽可能远的一段距离后,继续进行比较。
KMP匹配时,主串的指针当匹配时会递增,不匹配时会停住不动,也正是因为主串指针没有回滚,KMP的匹配效率才得以提升

11 字符串”qiniu”根据顺序不同有多少种排列组合的方式?C

96

72

60

24

答案是C
可以分成2个种情况,第一种,把两个i绑着一起,那么就是A(4,4)=24
第二种,两个i不在一起,三个字符先全排列为A(3,3)再插空,C(4,2)所以为:A(3,3 )* C(4,2)=36
所以为60

12 字符串 “YONYOU”,有几种不同的全排列方式?180
简单的概率学
首先有6个位置
先排N ,U有65=30种
再排Y,Y只有4个坑了有4
3/2=6种
最后2个位置给O,O,所以总共30*6=180种

在这里插入图片描述
在这里插入图片描述

13 若有以下定义和语句: 则输出结果是 A

 char s1[]="12345",*s2="1234";
 printf("%d\n" ,strlen(strcpy(s1,s2))); 
4

5

9

10
  1. 字符串最后以 ’ \0 ’ 结束。strcpy将’1234\0’复制到目的地址

  2. strlen()遇到 ’ \0 ’ 停止

strlen(str)求字符串的长度,遇到\0是结束计算,不算 \0,且从1开始计数。 1234\0所以长度为4.

strcpy(s1,s2)这个函数是把s2字符串拷贝到s1这个字符串,同时也把s2的 ‘\0’ 拷过去,所以覆盖了s1的所有字符(在空间足够的情况下,当然遇到s1的空间不足以存放s2,另考虑),所以strcpy执行完后是“1234” strlen(“1234”) 就是4了

在这里插入图片描述
14 字符串www.qq.com所有非空子串(两个子串如果内容相同则只算一个)个数是(50)
在这里插入图片描述

15 若串S=′software′,其子串的数目是(37)

如果每个字符都不同,则用下面的公式
在这里插入图片描述
在这里插入图片描述

16 字符串′ababaabab′的nextval为(A)

(0,1,0,1,0,4,1,0,1)

(0,1,0,1,0,2,1,0,1)

(0,1,0,1,0,0,0,1,1)

(0,1,0,1,0,1,0,1,1)

在这里插入图片描述
17 在下列关于“字符串”的陈述中,不正确的描述是(C)

字符串是一种特殊的线性表

字符串可以连续存储,也可以链式存储

字符串的长度必须大于零

‘’空串”与“空白串”不是同一个含义

在这里插入图片描述
字符串是一种特殊的线性表,它的每个结点仅由一个字符组成。A正确;
顺序存储和链式存储时两种最基本的存储结构,字符串通常采用顺序存储,但是字符串较长而没有那么大的连续空间时,可以把一个字符串分成多个小串,串与串之间采用链式存储。B正确;
字符串的长度可以为0,C错误;
空串是零个字符的串,它的长度为零。而空白串是指由一个或多个空格组成的串,它的长度为串中空格字符的个数。D正确。

18 以下数据结构中,哪一个是线性结构(D)?

广义表

二叉树

稀疏矩阵

串

在这里插入图片描述

A,广义表是非线性结构的,它也是线性表的一种推广
B,二叉树是树状结构
C,稀疏矩阵常用来存储图
D,串,如字符串,是线性结构

19 下面函数的功能是 A

int fun(char *x)
{
    char *y = x;
    while (*y++);
    return (y - x - 1);
}
求字符串的长度

比较两个字符串的大小

将字符串x复制到字符串y

将字符串x连接到字符串y后面
 分析fun函数,  char *y = x;//定义y指针指向x指针指向的字符串,此时x与y指针地址相同
 while (*y++);//当*y!='\0'时,指针指向字符串的下一位,直到*y=='\0',由于此时还会执行++操作符,所以
 此时y指针指向字符串末尾结束符的下一位,即此时指针y已经移动了字符串长度+1位,
所以y-x-1即为字符串的长度 

传入参数为指向字符串首地址的x指针
将x指针赋值给y指针,使它们同时指向字符串首地址
y指针不断向后移动,直至为字符串末尾后一位
y-x-1 为字符串大小

20 在存储数据时,通常不仅要存储各数据元素的值,而且还要存储(C)

数据的操作方法

数据的存取方法

数据元素之间的关系

数据元素的类型

数据结构的实质就是相互存在各种特定关系的数据元素的集合
数据元素是数据的基本单位。根据数据元素之间的关系的不同特征,可以分成集合、线性结构、树状结构、图状或者网状结构4类基本结构。存储数据时,通常不仅要存储数据元素的值,还要存储元素之间的关系。

21 若用一个大小为 6 的数组来实现循环队列,且当 rear 和 front 的值分别为 0 和 3 。当从队列中删除一个元素,再加入两个元素后, rear 和 front 的值分别为 。 B

15

24

42

51

1、队列添加元素是在队尾,删除元素是在队头;
2、添加元素,尾指针rear+1;删除元素,头指针front+1;
3、本题中,删除一个元素,front+1,也就是3+1=4;添加2个元素,rear+2,也就是0+2=2;
4、选 B’

22 下面程序段的输出结果是 D

char *p1 =123, *p2 = ”ABC”, str[50] = “xyz”;
strcpy(str + 2, strcat(p1, p2));
printf(%s\n”, str);
xyz123ABC

z123ABC

xy123ABC

出错

char *p1=“123” 声明了个字符串指针p1,指向字符串“ 123 ”,此时的“ 123 ”存放在常量区,并没有在拷贝到栈中,所以不能修改,如修改p1[0] = '2’就是错误的。
建议改为char p1[10] = “123”,就可以修改p1的值。

常量指针p1,我们可以改变它指向的地址,但不能改变指向的内容,如果改变了,就会出错

23 串是一种数据对象和操作都特殊的线性表(√)
串的逻辑结构和线性表很相似,不同之处在于串针对的是字符集,也就是串中的元素都是字符。对于串的基本操作与线性表是有很大的差别的。线性表更关注的是单个元素的操作,比如说查找一个元素,插入或者删除一个元素,但串中更多的是查找子串位置,得到指定子串,替换子串等操作

串又称为字符串,是一种特殊的线性表,其特殊性体现在数据元素是一个字符,也就是说串是一种内容受限的线性表。(栈和队列是操作受限的线性表)

24 由4个“1”和4个“0”组成的8位二进制补码,能表示的最小整数是(C)

-125

-32

-121

-3

在这里插入图片描述
25 用 0 - 9 这 10 个数字组成一个首尾相连的字符串,每个数字可以重复出现多次,并且字符串中任意 2 个数字都相邻出现过。此字符串最小长度是(50)

数字0必须与其他9个数字相邻,则0最少出现5次。每个数字的地位均等,根据对称性,50

在这里插入图片描述26 用二进制来编码字符串“abcdabaa”,需要能够根据编码,解码回原来的字符串,最少需要()长的二进制字符串? 14

按照信息论的思路,总的信息熵为H=-1/2log(1/2)-(1/4)log(1/4)-2*(1/8)log(1
/8)=1.75。也就说每一位的信息量为1.75bit,总共有8位,总的信息量
为:1.75*8=14bit。编码压缩的极限就是14bit了 

27 str中的字符串是 D
有如下语句序列:
char str[10];cin>>str;
当从键盘输入”I love this game”时,str中的字符串是

"I love this game"

"I love thi"

"I love"

"I"

cin遇到空格 结束输入,所以只读取I

一 . cin>>

该操作符是根据后面变量的类型读取数据。

输入结束条件 :遇到Enter、Space、Tab键。

对结束符的处理 :丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值