1.多型数据类型是指包含的数据元素的类型并不确定。
比如栈可以是整数栈、字符栈、对象栈等等。
但是字符串,它的元素必然是字符。
2.两个长度不相同的串不可能相等。
先判断长度是否相等,不相等则结果直接为不相等;
长度相等才继续判断是否对应位置上的每个字符串是否相等,如果所有对应位置字符都相等,结果为相等,否则为不相等。
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。
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和2、3、4、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快。 1、三者执行速度:StringBuilder > StringBuffer > String ;
2、StringBuilder:线程非安全的;
3、StringBuffer:线程安全的;
4、用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。