实习面试遇到的问题总结
Q1
给定两个字符串,求出它们之间最长的相同子字符串的长度。
暴力求解:
以字符串中的每个字符作为子串的端点,判定以此为开始的子串的相同字符最长能达到的长度,挨个寻找每一个可能的最大子串,时间复杂度为 O(n3);
动态规划法:
暴力解法是从字符串开端开始找寻,现在换个思维考虑以字符结尾的子串来利用动态规划法。假设两个字符串分别为s和t,s[i]和t[j]分别表示其第i和第j个字符(字符顺序从0开始),再令L[i, j]表示以s[i]和s[j]为结尾的相同子串的最大长度。应该不难递推出L[i, j]和L[i+1,j+1]之间的关系,因为两者其实只差s[i+1]和t[j+1]这一对字符。若s[i+1]和t[j+1]不同,那么L[i+1, j+1]自然应该是0,因为任何以它们为结尾的子串都不可能完全相同;而如果s[i+1]和t[j+1]相同,那么就只要在以s[i]和t[j]结尾的最长相同子串之后分别添上这两个字符即可,这样就可以让长度增加一位。合并上述两种情况,也就得到L[i+1,j+1]=(s[i]==t[j]?L[i,j]+1:0)这样的关系。最后就是注意临界值的问题,当i和j等于0时,优先处理好再进行动态规划。时间复杂度为O(n2)。
Q2
64位机上,一个结构体有三个成员,分别是char,int,short类型,三个成员位于结构体中不同位置时整个结构体的大小可能是哪些值?
答案:8、12
内存对齐规则:
1、 对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是min(#pragma pack()指定的数,这个数据成员的自身长度) 的倍数。例如char,int,short;char首先存储在偏移量为0的位置,再来存储int,int占四个字节,则其存储位置偏移量必须为4的倍数,于是存储在偏移量为4的位置,short存储在偏移量为8的位置。
2、 在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
#pragma pack(n) 表示设置为n字节对齐。 VC6默认8字节对齐。