未分類

Reverse Integer

Reverse Integer

Reverse digits of an integer.

Exmaple1:

1
x = 123, return 321

Exmaple2:

1
x = -123, return -321

Have you thought about this?

Here are some good questions to ask before coding. Bonus points for you if you have already thought through this!

If the integer’s last digit is 0, what should the output be? ie, cases such as 10, 100.

Did you notice that the reversed integer might overflow? Assume the input is a 32-bit integer, then the reverse of 1000000003 overflows. How should you handle such cases?

For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

提示 解題應用 額外的Package
Math 字串、型別 math、strconv

Default:

1
2
func reverse(x int) int {
}

解答思路:

這次很單純我直接採用字串的方式來做處理,不過因為go會幫你將輸出的int轉成是int64,所以他給的測試值不會overflow,所以我才再載入math的package去取得int32的最大與最小值來判斷是否溢位,有點像是用大炮打小鳥的概念,另外這邊之所以還用上另一個strconv是因為如果直接將數字轉字串,我想結果大家應該都曉得會拿到ascii轉出來的字串,當然如果你不想要使用上述兩個package,另外一種解法就是將數字%10取餘數(尾數),接著再將原數/10後再重覆上述行為直到將每一位數取出,只不過這邊就還要再一組回圈將每一位數一一*10^n加回成總數,照自己喜歡的方式處理,不過如果是負數的話記得要在index為0的時候做判斷取出。

程式碼解說:

go的strconv提供我們能直接將數字轉字串與字串轉回數字的方法,前者能直接拿到結果,後者會多回傳一個error以此來判斷字串能否順利轉成數字。

1
2
str := strconv.Itoa(x)
i, err := strconv.Atoi(string(result))

因為go將字串轉成數字是所儲存的型別為int64,而問題所要的溢位情況是int32,所以我們載入math藉以取出該儲存單位的上界與下界值來判斷經轉換後能否存入int32,若是直接以int32(int64)強制轉化的話,超出的位元數會直接被捨棄掉只取前面32位元。

1
2
3
if err != nil || i > math.MaxInt32 || i < math.MinInt32 {
return 0
}

完整程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
func reverse(x int) int {
str := strconv.Itoa(x)
slen := len(str)
result := make([]rune, slen)
for key, value := range str {
str = string(value)
if key == 0 && str == "-" {
result[key] = rune(value)
} else {
result[slen-1] = rune(value)
slen--
}
}
i, err := strconv.Atoi(string(result))
if err != nil || i > math.MaxInt32 || i < math.MinInt32 {
return 0
}
return i
}

總結:

倒數想到的做法有兩種:

  • 數字轉字串方式處理
  • 數字取餘數做倒數後,一一乘上十的倍數做總合
分享到