浙江高端網(wǎng)站建設(shè)合肥百度搜索優(yōu)化
提取公共代碼
- 前言
- 一、字母版上的路徑
- 二、貪心
- 1、idea
- 2、go
- 3、代碼不斷拆分復(fù)用的過程
- 總結(jié)
- 參考文獻(xiàn)
前言
寫代碼,在提高效率的同時,要方便人看,這個人包括自己。大函數(shù)要拆分成一些小函數(shù),讓每個函數(shù)的宏觀目的和步驟都顯得清晰,讀起來才容易懂。除此之外,拆分也有講究,提取公共代碼,盡量減少重復(fù)無意義的代碼,提高復(fù)用率。
一、字母版上的路徑
二、貪心
1、idea
// 根據(jù)字母的ascall碼可以確定它在board中的坐標(biāo)。
// a - 97 == v,<x = v / 5,y = v % 5>
// cur:<0,0> t: <x,y>
// 前5行,先x或者y都無所謂
// 前五行到第6行,只能先y再x
// 第6行到前5行,只能先x再y
2、go
func alphabetBoardPath(target string) string {sb := &strings.Builder{}n := len(target)x,y := 0,0upDown,LeftRight := [2]byte{'U','D'},[2]byte{'L','R'}for i := 0;i < n;i++ {// 定位該字符在黑板上的坐標(biāo)v := target[i] - 97nx,ny := int(v / 5),int(v % 5)// 根據(jù)當(dāng)前坐標(biāo)和目的坐標(biāo)進(jìn)行移動。if nx == 5 {// 去z那個地方,必須先L,再Dmove(y,ny,sb,LeftRight)move(x,nx,sb,upDown) } else {move(x,nx,sb,upDown)move(y,ny,sb,LeftRight) }// 尋找到該字符,將其加入。sb.WriteByte('!')x,y = nx,ny}return sb.String()
}
// 不斷抽象,復(fù)用代碼。
// 最開始是xY(int,int,int,int,*strings.Builder)函數(shù),以及yX(int,int,int,int,*strings.Builder)函數(shù);
// 發(fā)現(xiàn)對x或y的動作是一致的,所以拆解成單個x的動作moveX | moveY,
// 繼續(xù)抽象,moveX | moveY代碼都差不多,只是加入的ch不一樣,所以將ch當(dāng)作變量傳入,將兩函數(shù)合并成move函數(shù)。
func move(z,nz int,sb *strings.Builder,choice [2]byte){zGap := z - nzch := choice[0]if zGap < 0 {ch = choice[1]}for i := 0;i < abs(zGap);i++ {sb.WriteByte(ch)}
}
func abs(x int) int {if x < 0 {return -x}return x
}
3、代碼不斷拆分復(fù)用的過程
// 不斷抽象,復(fù)用代碼。
// 最開始是xY(int,int,int,int,*strings.Builder)函數(shù),以及yX(int,int,int,int,*strings.Builder)函數(shù);
// 發(fā)現(xiàn)對x或y的動作是一致的,所以拆解成單個x的動作moveX | moveY,
// 繼續(xù)抽象,moveX | moveY代碼都差不多,只是加入的ch不一樣,所以將ch當(dāng)作變量傳入,將兩函數(shù)合并成move函數(shù)。
func move(z,nz int,sb *strings.Builder,choice [2]byte){zGap := z - nzch := choice[0]if zGap < 0 {ch = choice[1]}for i := 0;i < abs(zGap);i++ {sb.WriteByte(ch)}
}
總結(jié)
1)每個函數(shù)拆分,做到有清晰的宏觀目的和宏觀步驟,這樣后來的人包括自己才能更容易的看懂。
2)拆分代碼,也要提取公共代碼,盡量減少重復(fù)無意義的代碼,提高復(fù)用率。
參考文獻(xiàn)
[1] LeetCode 字母板上的路徑