两道MS的面试题 及答案

1.一个整型数组,知道长度,里面存放有:负数/正数/零,请求"子串之和最大"的子串,函数返回该子串之和.函数形式:   int   f(int*   array,   int   length);  
          举例:   array   =   {7,6,3,-10,2,-8,6}  
                      和最大的子串为:   7   +   6   +   3   =   16  
                      函数返回:   16  
          建议测试用例:   {7,6,3,-10,200,-8,6}   ->   return   7   +   6   +   3   +   (-10)   +   200   =   206,  
                                      {7,6,3,-100,2,-8,6}   ->   return   2,  
                                      {100,-200,100,-10,100}   ->   return   100   +   (-10)   +   100   =   190.  
          其他情况可另行测试.  

答案如下:
        static int GetMaxString(int[] arr)
        
{
            
int curMax = 0;

            
int i = 0;
            
int j = 0;

            
int length = arr.Length;

            
int[] arrMax = new int[length];

            
for (; i < arr.Length; i++)
            
{
                
if (arr[i] < 0)
                    
continue;
                
else
                    
break;
            }


            
if (i == arr.Length && arr[i - 1< 0)
            
{
                
int tmpMax2 = arr[0];

                
for (int m = 0; m < arr.Length; m++)
                
{
                    
if (tmpMax2 < arr[m])
                    
{
                        tmpMax2 
= arr[m];
                    }

                }


                
return tmpMax2;
            }


            
for (; i < arr.Length; i++)
            
{
                
if (arr[i] >= 0)
                
{
                    curMax 
+= arr[i];

                    
if (i == arr.Length - 1)
                    
{
                        arrMax[j
++= curMax;
                    }

                }

                
else
                
{
                    arrMax[j
++= curMax;

                    
if (curMax + arr[i] >= 0)
                    
{
                        curMax 
+= arr[i];
                    }

                    
else
                    
{
                        curMax 
= 0;
                    }

                }

            }


            
int tmpMax = arrMax[0];

            
for (int k = 1; k < j; k++)
            
{
                
if (tmpMax < arrMax[k])
                
{
                    tmpMax 
= arrMax[k];
                }

            }


            
return tmpMax;
        }



2.一个没有排序的链表,比如list={a,l,x,b,e,f,f,e,a,g,h,b,m},请去掉"重复项,并保留原顺序",以上链表去掉重复项后为newlist={a,l,x,b,e,f,g,h,m},请写出一个高效算法(时间比空间更重要)  
          提示:如果采用先排序,在去掉重复项的办法,复杂度为n+nlogn(采用快排),显然不是最优解,而且破还了"原顺序".还有其他解法.  

答案如下:

        static void Main(string[] args)
        
{
            Link link1 
= new Link('a');

            Link link2 
= new Link('l');
            Link link3 
= new Link('x');
            Link link4 
= new Link('b');
            Link link5 
= new Link('e');

            Link link6 
= new Link('f');
            Link link7 
= new Link('f');
            Link link8 
= new Link('e');
            Link link9 
= new Link('a');

            Link link10 
= new Link('g');
            Link link11 
= new Link('h');
            Link link12 
= new Link('b');
            Link link13 
= new Link('m');

            link1.Next 
= link2;
            link2.Next 
= link3;
            link3.Next 
= link4;
            link4.Next 
= link5;
            link5.Next 
= link6;
            link6.Next 
= link7;
            link7.Next 
= link8;
            link8.Next 
= link9;
            link9.Next 
= link10;
            link10.Next 
= link11;
            link11.Next 
= link12;
            link12.Next 
= link13;
            link13.Next 
= null;

            link1.Prev 
= null;
            link2.Prev 
= link1;
            link3.Prev 
= link2;
            link4.Prev 
= link3;
            link5.Prev 
= link4;
            link6.Prev 
= link5;
            link7.Prev 
= link6;
            link8.Prev 
= link7;
            link9.Prev 
= link8;
            link10.Prev 
= link9;
            link11.Prev 
= link10;
            link12.Prev 
= link11;
            link13.Prev 
= link12;

            Link link 
= link1;


            
int[] tmp = new int[256];

            Link tmpLink 
= link;

            
while (tmpLink != null)
            
{

                tmp[Convert.ToInt32(tmpLink.Chr)]
++;

                tmpLink 
= tmpLink.Next;
            }


            Link tmpLink2 
= link;
            
int count = 0;

            
while (tmpLink2 != null)
            
{
                count
++;

                
if (tmp[Convert.ToInt32(tmpLink2.Chr)] == 2)
                
{
                    tmp[Convert.ToInt32(tmpLink2.Chr)]
++;
                }

                
else if (tmp[Convert.ToInt32(tmpLink2.Chr)] == 3)
                
{
                    tmpLink2.Prev.Next 
= tmpLink2.Next;
                }


                tmpLink2 
= tmpLink2.Next;
            }



            Link tmpLink3 
= link;
            
while (tmpLink3 != null)
            
{
                Console.WriteLine(tmpLink3.Chr.ToString());

                tmpLink3 
= tmpLink3.Next;
            }


            Console.Read();
        }

 



 

posted @ 2008-02-28 18:29  包建强  Views(696)  Comments(0Edit  收藏  举报