題目描述為給定一個 32 位元帶有正負符號的整數,要求返回他的反轉數。
題目有補充說明可接受的數值範圍為 : [−2³¹, 2³¹ − 1],反轉後的數不在此範圍內則返回0。
我們可以先把該整數轉成字串後反轉再轉回數字,然後檢查是否符合範圍。
參考程式碼
func reverse(x int) ( int) {
sign:=1
if x<0{
sign=-1
x=-x
}
s:=strconv.Itoa(x)
bs:=[]byte(s)
head:=0
tail:=len(bs)-1
for head<tail{
bs[head],bs[tail]=bs[tail],bs[head]
head++
tail--
}
rs:=string(bs)
if sign==-1{
rs="-"+rs
}
y, err := strconv.Atoi(rs)
if err!=nil{
fmt.Println(err,rs)
}
if( (y > math.MaxInt32) || (y < math.MinInt32)) {
return 0
}
return y
}
我們也可以直接處理數字 x 得到他的反轉數。處理方式為初始化一個新的數 y,對 x 取最後一位得到的餘數 r 直接放到 y 數字的後面,重複此流程直到取完 x 的所有位數。
參考程式碼
func reverse(x int) ( int) {
y:=0
r:= 0
sign:=1
if x<0{
sign=-1
x=-x
}
for x>0{
r=x%10
y=y*10+r
x=x/10
}
y*=sign
if( (y > math.MaxInt32) || (y < math.MinInt32)) {
return 0
}
return y
}
在此題中對負數取餘數也可以直接得到我們要的結果 (ex: -31%10 會得到 -1 ),但筆者還是習慣先全部轉為正數再做處理。而 Go 語言中 int 型別的大小,官方文件是這麼寫的:
The int, uint, and uintptr types are usually 32 bits wide on 32-bit systems and 64 bits wide on 64-bit systems. When you need an integer value you should use int unless you have a specific reason to use a sized or unsigned integer type.
解法 2 中宣告的 y 是 int 型別,如果在32位元系統此方法不適用,需要進行修改。此做法筆者是在網路上看到的分享解法:
我們需要多檢查每次迭代完後的數值是否溢位,檢查方式為對其數字逆運算後與前一次迭代結果相比,如果不一致則表示溢位了。修改後參考程式碼如下:
func reverse(x int) ( int) {
prey:=0
y:=0
r:= 0
sign:=1
if x<0{
sign=-1
x=-x
}
for x>0{
r=x%10
y=y*10+r
if ((y-r)/10 )!= prey{
return 0
}
prey=y
x=x/10
}
y*=sign
if( (y > math.MaxInt32) || (y < math.MinInt32)) {
return 0
}
return y
}
附上簡單的測試,程式碼 在此。