字符串问题

1.多型数据类型是指包含的数据元素的类型并不肯定。数组

好比栈能够是整数栈、字符栈、对象栈等等。安全

可是字符串,它的元素必然是字符。ide


2.两个长度不相同的串不可能相等。性能

先判断长度是否相等,不相等则结果直接为不相等;ui

长度相等才继续判断是否对应位置上的每一个字符串是否相等,若是全部对应位置字符都相等,结果为相等,不然为不相等。线程


3.在64位平台机器下sizeof(string_a),sizeof(string_b)大小分别是对象

  1.char *string_a=(char *)malloc(100*sizeof(char));     8内存

  2.char string_b[100];             100字符串

  

串′ababaaababaa′的next数组为011234223456。string

   i     0    1    2    3    4    5   6   7    8   9   10  11

   s     a    b    a    b    a    a   a   b    a   b   a    a  

next[i]   -1   0    0   1     2    3   1   1    2    3   4    5

先计算前缀next[i]的值: (字符串匹配是 从头开始的 和 从尾开始的字符串进行匹配是否重复 )

next[i]的值主要是看s[i]以前的字符串中重复的子串长度。next[0] = -1,定值。  

next[1]是看s[1]以前的字符串“a”中重复的子串长度为0,故next[1] = 0。

next[2]是看s[2]以前的字符串“ab”中重复的子串长度为0,故next[2] = 0。

next[3]是看s[3]以前的字符串"aba"中重复的子串长度,s[0]与s[2]重复,长度为1,故next[3] = 1。

next[4]是看s[4]以前的字符串"abab"中重复的子串长度,s[01]与s[23]重复,长度为2,故next[4] = 2。

next[5]是看s[5]以前的字符串"ababa"中重复的子串长度,s[012]与s[234]重复,长度为3,故next[5] = 3。

next[6]是看s[6]以前的字符串"ababaa"中重复的子串长度,s[0]与s[5]重复(由于多了一个a,没法找到长度为3的重复字符串,

这只能是s[0]和s[5]重复),长度为1,故next[6] = 1。

一样的,求next[7]和next[8]、next[9]、 next[10]、 next[11] 分别为1和二、三、四、5。


next数组下标从1开始计算

next[1] 确定是 0 

next[2] 确定是 1

next[n] 的状况,将前面n-1个字符,计算从首尾开始组成最大的相同子串的长度,若是找到,那么next值是该长度加1,不然next值是1。

举例:

next[6]的计算,字符串第六位是 a ,( ababa a ababaa)

将前面的5个字符,从头尾开始取4个组成子串比较,若是不相等,则从首尾取3个字符组成子串继续比较,并以此类推, 

若是一直比较到最后一个字符都不相等,那么该next值为1。

4个字符的状况:abab : baba

3个字符的状况:aba   :  aba  此时相等,那么next[6] = 3+1 = 4


4.字符串www.qq.com全部非空子串(两个子串若是内容相同则只算一个)个数是50

非空子串的个数共有n(n+1)/2=55个,因为相同子串算一个,因此要减去2个w,一个.,一个ww,一个q,因此还有50个。

要求的是子串,从左到右一次截取, 10个字符的子串,1个; 9个字符的子串,2个; 

8--------3个, 7---------4个, ......... 1-----------10个 

共有:1+2+3+...+10=10*(10+1)/2=55 

减去重复的: 1个字符时有3个w,2个q,2个. 2个字符时有2个ww 故应减去:(2+1+1+1)=5 答案:55-5=50。


5.设栈的初始状态为空,当字符序列a3_做为栈的输入时,输出长度为3的且能够用做C语言标识符的字符串序列有3个。

分别是:a3_.a_3,_3a.

首先,栈的顺序是先进后出

字符序列为a3_   1)a入栈,再出栈,而后3入栈,再出栈,—入栈,再出栈   序列是a3_

                           2)a入栈,再出栈,而后3,—入栈,再出栈,序列是a_3

                           3)a入栈,3入栈,再出栈,a出栈, —入栈,再出栈   序列是3a_

                           4) a入栈,3入栈,再出栈, —入栈,序列是3_a

                           5) a入栈,3入栈,_入栈,序列是_3a

其次,C语言的标识符不能以数字开头,去除3a_和3_a   答案为3。


6.String str = new String(“abc”),“abc”在内存中的分配是堆,字符串常量区。

当你new String("abc")时,其实会先在字符串常量区生成一个abc的对象,而后new String()时会在堆中分配空间,

而后此时会把字符串常量区中abc复制一个给堆中的String,故abc应该在堆中和字符串常量区。


7."abc"+"def"则会建立三个字符串对象,第三个是"abcdef"。也就是说,在Java中对字符串的一切操做,都会产生一个新的字符串对象。

StringBuffer是线程安全的,它比String快。 一、三者执行速度:StringBuilder > StringBuffer > String ;

二、StringBuilder:线程非安全的;

三、StringBuffer:线程安全的;

四、用String操做字符串时,其实是在不断地建立新对象,而原来的对象会做为垃圾被回收;

(1)String建立字符串是不可变的,任何对String的改变都会引起新的String对象的生成;

(2)StringBuffer是可变的,任何对它所指代的字符串的改变都不会产生新的对象; 因此,当改变字符串的内容时,StringBuffer能得到更好的性能;

(3)StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高;


8.中缀表达式(a+b)*c*(d-e/f) 转成后缀  ab+c*def/-*。

中缀表达式转后缀表达式的方法:

1.遇到操做数:直接输出(添加到后缀表达式中)

2.栈为空时,遇到运算符,直接入栈

3.遇到左括号:将其入栈

4.遇到右括号:执行出栈操做,并将出栈的元素输出,直到弹出栈的是左括号,括号不输出。

5.遇到其余运算符:加减乘除:弹出全部优先级大于或者等于该运算符的栈顶元素,而后将该运算符入栈

6.最终将栈中的元素依次出栈,输出。


9.串是一种特殊的线性表,其特殊性体如今数据元素是一个字符.

串就是字符串,是一种特殊的线性表,它的每一个结点仅由一个字符组成。

串值也可用链表来存储,因为串的数据元素是一个字符,它只有8位二进制数, 所以用链表存储时,一般一个结点中存放的不是一个字符,而是一个子串,例如: 在编辑系统中,整个文本编辑区能够当作是一个串,每一行是一个子串,构成一个结点。


10.字符串一般采用的两种存储方式是顺序存储和链式存储.

顺序存储和链式存储时两种最基本的存储结构,字符串一般采用顺序存储,可是字符串较长而没有那么大的连续空间时,能够把一个字符串分红多个小串,串与串之间采用链式存储.


11.串的长度:串中字符数目 n 称为串的长度;串长度是指串中全部字符的个数。

零个字符的串称为空串,长度为零。


12.在C语音中有:

string 和 int 型都支持直接加减

'C'+'8'-'3'= 'C'+'5',因为'C'+1='D',因此结果为char 'H' => %c;

‘9’-‘0’:平时写代码的时候常常int(0~9)转换char就用的+'0',所以结果直接就是int 9 => %d。

相关文章
相关标签/搜索