後端面試(Golang)可能會碰上的附加智力題

1、猴子爬山問題:

問題:一個猴子在一座n級的山腳準備爬山,猴子上山一步可跳1級或3級,試問爬到第n階臺階,共有多少種不同的爬法?

//簡單遞推設計

這一問題實際上是一個整數有序可重複拆分的問題。試應用數組遞推求解,設爬k級臺階的不同爬法爲f(k)種。

    探求f(k)的遞推關係

    上山最後一步到達第30級臺階,完成上山,共有f(30)種不同的爬法,到第30級之前位於哪一級呢?無非就是位於第29級(上跳1級即可到),有f(29)種;或者位於第27級(上跳3級即可到),有f(27)種;於是f(30)=f(29)+f(27)

     依次類推,有以下遞推關係:

           f(k) = f(k-1)+f(k-3)            (k>3)

//golang解法:

package main

import "fmt"


/*
猴子爬山
*/

func main() {
	var n int
	//n 大於2
	fmt.Print("請輸入臺階總數n:")
	_, err := fmt.Scan(&n)
	if err != nil {
		fmt.Println("error")
		return
	}
	ways(n)
}

func ways(n int) {
	f := make([]int, n)
	f[0] = 1
	f[1] = 1
	f[2] = 2

	for i:=3; i<n; i++{
		f[i] = f[i-1] + f[i-3]
	}
	//請輸入臺階總數n:40
	//共有2670964種不同的爬法
	fmt.Printf("%d階樓梯共有的爬法數:%d",n, f[n-1])
}

2、8個乒乓球找出其中較重的一個:

你有8個一樣大小的球,其中7個的重量是一樣的,另一個比較重。怎樣能夠用天平僅稱兩次將那個重一些的球找出來。

解析:

爲了方便,我們將球編號爲:1,2,3,4,5,6,7,8,則我們的方案如下:

step 1 :將1,2,3放在天平左側,4,5,6放在天平右側,進行一次稱量,結果有兩種:

(1). 平衡,則重球在7,8中,稱量一次7和8即可獲得結果;

(2). 不平衡,假設1,2,3重,則拿出1和2稱量一次,假設平衡則3是重球,否則爲1,2中較重的球;

4,5,6重時和1,2,3重的處理方式相同;

3、小明一家過橋問題:



題目:小明一家過一座橋,過橋時是黑夜,所以必須有燈。現在小明過橋要1秒,小明的弟弟要3秒,小明的爸爸要6秒,小明的媽媽要8秒,小明的爺爺要12秒。每次此橋最多可過兩人,而過橋的速度依過橋最慢者而定,而且燈在點燃後30秒就會熄滅。問:小明一家如何過橋?

答案:1、小明和小明弟弟過橋,需要花費3秒(小明弟弟慢,花3秒),計T1 = 3秒,總用時TC=3秒;

     2、小明回來,需要花費1秒,記T2=1秒,總用時TC=4秒;

     3、小明爺爺和小明媽媽一起過橋,需要花費12秒,記T3=12,總用時TC=16秒;

     4、小明弟弟回來,需要花費3秒,記T4=3秒,總用時TC=19秒;

     5、小明和小明爸爸一起過橋,需要花費6秒,記T5=6秒,總用時TC=25秒;

     6、小明回來,需要花費1秒,記T6=1秒,總用時TC=26秒;

     7、小明和小明弟弟一起過橋,需要花費3秒,記T7=3秒,總用時TC=29秒;

這樣,在第3步,小明爺爺和媽媽過橋後留下,第5步,小明爸爸過橋後留下,第7步,小明和小明弟弟過橋後,一家人成功在30秒內過橋。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章