笔试的一题编程题:
字符串中“*”能代表一串字符,“?”能代表一个字符,然后给出两个含有前两个字符的字符串是否匹配。
变态的面试题:gcc是怎么实现的。
顺便说一下八爪鱼的Intel的面试题:
1 一个很大的数组中,放有一系列有正有负的数,如何找出和最大的那个区间。
思想:动态规划。
2 删除string中的某种字符前的字符,如‘/b’前的字符,不能用附加空间,且字符移动次数最少。
八抓鱼第一题:
考虑如下:
1。此区间肯定不以负数开头,不以负数结尾。
2。从左往右扫描,把所有的连续正数的看成一个区间,最后就成这种形式:AaBbCc。。。
假设大写字母表示正的连续区间,小写表示负的连续区间。
3。分析AaB,看是否要把这3个区间合并成一个区间。
设置三个全局的变量,分别标记目前最大的区间,前面的区间,和当前的区间。
若:A+a+B>B,则需要把这个区间合并,并赋给前面的区间
若A+a+B>最大的区间,则还要把他赋给最大的区间
若:A+a+B<=B,则不合并,并看是否要把B赋值给最大区间
代码如下: (找不到源程序了,这个是从我另一个博客copy过来的,有点乱)
#i nclude
using namespace std;
class segMent
{
private:
int start;
int end;
int sum;
public:
segMent(int st,int ed,int sm):start(st),end(ed),sum(sm)
{
}
void set(int st,int ed,int sm)
{
start=st;
end=ed;
sum=sm;
}
int getStart()
{
return start;
}
int getEnd()
{
return end;
}
int getSum()
{
return sum;
}
};
void getCurrentSegMent(int *a,int start,int len,segMent& sg)
{
int sum=0;
for(int i=start;a[i]>0&&i {
sum+=a[i];
}
sg.set(start,i-1,sum);
}
void mergeSegMent(int* a, segMent& max, segMent& prev, segMent& current)
{
if(prev.getEnd()==-1)
{
max.set(current.getStart(),current.getEnd(),current.getSum());
prev.set(current.getStart(),current.getEnd(),current.getSum());
return;
}
int negtive=0;
int i=prev.getEnd()+1;
int j=current.getStart()-1;
for(i;i<=j;++i)
negtive+=a[i];
int number=prev.getSum()+negtive+current.getSum();
if(number>current.getSum())//合并后大于前面的,则合并
{
prev.set(prev.getStart(),current.getEnd(),number);
if(number>max.getSum())//看最大者是否是合并后的
max.set(prev.getStart(),current.getEnd(),number);
}
else//不进行合并,但要看最大者是否为current
{
prev.set(current.getStart(),current.getEnd(),current.getSum());
if(current.getSum()>max.getSum())
max.set(current.getStart(),current.getEnd(),current.getSum());
}
}
void getMax(int *a,int len)
{
segMent max(0,-1,0);
segMent prev(0,-1,0);
for(int i=0;i {
if(a[i]<=0)
continue;//ignore the negtive integer
segMent current(0,-1,0);
getCurrentSegMent(a,i,len,current);//obtain the next continous positive integers
cout< i=current.getEnd();
mergeSegMent(a,max,prev,current);
}
cout<<"max from "<