Google面試題(六)

2021-05-24 02:17:58 字數 1300 閱讀 2510

題目:對現在的stack(棧)資料結構進行改進,加乙個min()功能,使之能在常數,即o(1),時間內給出棧中的最小值。可對push()和pop()函式進行修改,但要求其時間複雜度都只能是o(1)。 

分析:要使pop,push,min都是o(1),所以肯定要犧牲點空間 

思路:1:在stack的資料結構中加兩個個字段,如 

typedef struct 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) 

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

if(xmin) 

s->min=x; 

return 0; 

} 每次pop的時候進行比較,如果pop的元素為min,則用second替換min。於是達到了取min的效果,程式如下 

int pop(stack *s,int *x) 

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

if(x==s->min) s->min=s->second; 

return 0; 

} int min( stack *s,int *x ) 

思路2:設定輔助棧ass,記錄每個狀態下的最小值,每次插入時,得到輔助棧當前值,和插入的值比較 

如果小則插入到最小值棧的就是它,否則就是原來的最小值,通過這種方式,pop,push,min三個都是 

o(1)演算法的。 

typedef struct stack; 

static int push_stack(stack *s,int x) 

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

return 0; 

} static int pop_stack(stack *s,int *x) 

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

return 0; 

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

else 

return 0; 

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

int min(stack *ass,int *x) 

Google 的面試題

一輛學校班車裡面能裝多少個高爾夫球?你被縮小到只有硬幣厚度那麼點高 不是壓扁,是按比例縮小 然後被扔到乙個空的玻璃攪拌器中,攪拌刀片一分鐘後就開始轉動。你怎麼辦?要是讓你清洗整個西雅圖的所有窗子,你會收取多少費用?怎麼才能識別出電腦的記憶體堆疊是向上溢位還是向下溢位?你要向你8歲的侄子解釋什麼是資料...

google雜湊面試題

題目 在乙個字串中找到第乙個只出現一次的字元。如輸入abaccdeff,則輸出b。用雜湊表解題 分析 這道題是2006年google的一道筆試題。解 由於字元 char 是乙個長度為8的資料型別,因此總共有可能256 種可能。於是我們建立乙個長度為256的陣列,每個字母根據其ascii碼值作為陣列的...

Google 的面試題

google 的面試題 這些應該都屬於智力測試類的題目吧,開始想想答案。一輛學校班車裡面能裝多少個高爾夫球?你被縮小到只有硬幣厚度那麼點高 不是壓扁,是按比例縮小 然後被扔到乙個空的玻璃攪拌器中,攪拌刀片一分鐘後就開始轉動。你怎麼辦?要是讓你清洗整個西雅圖的所有窗子,你會收取多少費用?怎麼才能識別出...