Google面试题(六)

转载 2011年01月11日 12:31:00

题目:对现在的Stack(栈)数据结构进行改进,加一个min()功能,使之能在常数,即O(1),时间内给出栈中的最小值。可对push()和pop()函数进行修改,但要求其时间复杂度都只能是O(1)。 

分析:要使pop,push,min都是O(1),所以肯定要牺牲点空间 

思路:1:在stack的数据结构中加两个个字段,如 

     typedef struct { 

           int data[MAX]; 

           int top; 

           int min; 

           int second; 

     }stack; 

          pop,push的时候都去栈顶元素,所以是O(1) 

          min的时候取stack的min字段,所以也是O(1) 

         每次push的时候进行比较,如果当前push的元素比stack->min小,则用当前元素替换stack->min,用原来的min替换second。如果当前push的元素比stack->min大,但比second小,则用当前元素替换stack->second。于是达到了取min的效果,程序如下 

          int push(stack * s,int x){ 

                 ASSERT(s!=NULL); 

                 if(s->top>=MAX)  

                 { 

                        printf("Stack overload!"); 

                        return -1; 

                 } 

                 s->data[s->top++]=x; 

                 if(x<s->min) 

                  s->min=x; 

                 return 0; 

        } 
        每次pop的时候进行比较,如果pop的元素为min,则用second替换min。于是达到了取min的效果,程序如下 
        int pop(stack *s,int *x) 

        { 

               ASSERT(s!=NULL); 

              if(s->top<=0) 

              { 

                      printf("Stack Empty!"); 

                      return -1; 

             } 

            (*x)=s->data[s->top--]; 
            if(x==s->min) s->min=s->second; 
           return 0; 



int min( stack *s,int *x ) 



      ASSERT(s!=NULL); 

      (*x)=s->min; 

     return 0; 




思路2:设置辅助栈ass,记录每个状态下的最小值,每次插入时,得到辅助栈当前值,和插入的值比较 

如果小则插入到最小值栈的就是它,否则就是原来的最小值,通过这种方式,pop,push,min三个都是 

O(1)算法的。 

typedef struct { 

     int data[MAX]; 

     int top; 

}stack; 

STATIC int push_stack(stack *s,int x) 



      ASSERT((s!=NULL)); 

      if(s->top>=MAX) 

      { 

            printf("Stack overload"); 

            return -1; 

      } 

     s->data[s->top++]=x; 

     return 0; 



STATIC int pop_stack(stack *s,int *x) 



      ASSERT(s!=NULL); 

      if(s->top<=0) 

      { 

              printf("Stack Empty"); 

              return -1; 

       } 

       (*x)=s->data[s->top--]; 

       return 0; 



int push(stack *main,stack *ass,int x) 



       ASSERT((main!=NULL)&&(ass!=NULL)); 

       int temp; 

       pop_stack(ass,&temp); 

       push_stack(main,x); 

       if(x<temp) 

       { 

               push_stack(ass,temp); 

               push_stack(ass,x); 

       } 

       else 

       { 

                push_stack(ass,temp); 

                push_stack(ass,temp); 

       } 

       return 0; 



int pop(stack *main,stack *ass,int *x) 



        ASSERT((main!=NULL)&&(ass!=NULL)); 

       int temp; 

       pop_stack(ass,&temp); 

       pop_stack(main,x); 

       return 0; 



int min(stack *ass,int *x) 



       ASSERT((main!=NULL)&&(ass!=NULL)); 

       pop_stack(ass,x); 

       push_stack(ass,(*x)); 

       return 0; 

白话经典算法系列之十 一道有趣的GOOGLE面试题

微博http://weibo.com/MoreWindows已开通,欢迎关注。 最近在微博上看到一道有趣的GOOGLE面试题,见下图: 文字版: 一个大小为n的数组,...
  • zxasqwedc
  • zxasqwedc
  • 2014年11月17日 16:05
  • 1403

六维空间等IPV6资源上不去的一种解决方法

前一段时间我也是出现这个问题,六维空间上不去,IPV6网站打开慢,IPV6网络电视看不了。开始以为是六维在线人数太多的原因,可偶然还原系统后发现又能上了,第二天又不行了。。。后来经过baidu goo...
  • ochonglangzheo
  • ochonglangzheo
  • 2013年12月10日 14:29
  • 5149

经典算法题:谷歌面试经典题目

谷歌面试官经典作品(CTCI)目录 1.1 判断一个字符串中的字符是否唯一 1.2 字符串翻转 1.3 去除字符串中重复字符 1.8 利用已知函数判断字符串是否为另一字符串的子串 2.1 从链表中移...
  • wangbaochu
  • wangbaochu
  • 2016年10月31日 00:14
  • 2639

谷歌公司15个最变态的面试智力题(附参考答案)

1.一辆校园巴士可以装多少个高尔夫球? 面试职位:产品经理 注解:Google公司提问这道智力题?的目的在于测试面试者是否可以找到解决问题的关键点。 下面是一位面试者马特(Matt ...
  • snyyjiao
  • snyyjiao
  • 2014年09月06日 22:17
  • 1678

微软Google等互联网公司经典面试智力题和解答

微软Google等互联网公司经典面试智力题和解答
  • stephenxe
  • stephenxe
  • 2016年08月20日 15:24
  • 3702

【JAVA秒会技术之秒杀面试官】JavaEE常见面试题(一)

个人结合诸多资料,总结的一些JavaEE常见面试题,主要针对初/中级程序员。想要word完整版下载的,评论里留言留下你的邮箱!...
  • qq296398300
  • qq296398300
  • 2016年12月08日 11:02
  • 1311

Google的一道面试题的推广(扔鸡蛋不破的层数,2个,3个,n个鸡蛋呢)

Google的面试题在论坛炒得很火,今年题目如下:“有一个100层高的大厦,你手中有两个相同的玻璃围棋子。从这个大厦的某一层扔下围棋子就会碎,用你手中的这两个玻璃围棋子,找出一个最优的策略,来得知那个...
  • chhuach2005
  • chhuach2005
  • 2014年09月08日 15:07
  • 1835

谷歌面试题——动态规划

#谷歌面试题# 两个鸡蛋:两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事。有座100层的建筑,要你用这两个鸡蛋以最少的次数确定哪一层是鸡蛋可以安全落下的最高位置。可...
  • Linoi
  • Linoi
  • 2013年08月06日 15:58
  • 2342

Google面试题之设计一个包含min函数的栈

定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min,push,以及pop的时间复杂度都是O(1)。算法思想:考虑增加一个辅助的堆栈,每次往原堆栈push数据时,同时将最小数...
  • sinat_33442459
  • sinat_33442459
  • 2017年04月28日 11:00
  • 188

google面试题

题目:写一个单链表,倒序输出。 解: #include #include #include using namespace std; typedef struct node { in...
  • DannyPassante
  • DannyPassante
  • 2013年05月08日 09:29
  • 382
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Google面试题(六)
举报原因:
原因补充:

(最多只允许输入30个字)