算法學習之路----迴文數

迴文數(Palindrome-Number)

這是一個比較簡單的題目,題幹如下:

判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
示例 1:
  輸入: 121
  輸出: true
示例 2:
  輸入: -121
  輸出: false
解釋: 從左向右讀, 爲 -121 。 從右向左讀, 爲 121- 。因此它不是一個迴文數。
示例 3:
  輸入: 10
  輸出: false
解釋: 從右向左讀, 爲 01 。因此它不是一個迴文數。
來源:力扣

解題思路

按照題目的定義: 負數一定不是迴文數,並且 [0,9] 的數一定是迴文數

其次,我們稍微延伸一下題目,如果判斷一個字符串是否是迴文字符串,我們會怎麼做?常規思路就是設置兩個指針 ij 分別指向字符串的第一個字符和最後一個字符,然後 指針 i 向後挪指針 j 向前挪,每挪動一次就比較 指針 i 指向的字符是否和指針 j 指向的字符相等。具體流程如下:

如上,那我們是不是可以沿用判斷字符串是否是迴文字符串的思路來判斷數字呢?當然是可以的啦。

所以現在的問題變成了怎麼拿到數字的第一位和最後一位?上一篇文章 讓我們一起啃算法----整數反轉 我們知道了 一個數與10取模可以得到最後一位的值。那第一位的值如何得到呢?可以用如下方式:

假設目標數字是 3245,它是一個四位數,最小的四位數是1000,3245 / 1000 就可以拿到第一位的值即 3 。

拿到了第一位的值和最後的一位的值之後,我們只需要判斷是否相等即可。

具體的代碼實現

GO語言實現:

func isPalindrome(x int) bool {
	if x < 0 {
		return false
	}
	div := 1
	// 得到相應位數的最小值
	// 例如:3245,那麼div的值就是1000
	for x / (div) >=  10 {
		div *= 10
	}
	for x != 0 {
		// 得到第一位的值
		left := x / div
		// 得到最後一位的值
		right := x % 10
		if left != right {
			return false
		}
		// 去掉第一位和最後一位
		// 例如:( 3245 - 3 * 1000 )/ 10 = 24
		x = (x - left * div) / 10

		// 因爲去掉了兩位,因此div也相應的調整
		div /= 100
	}
	return true
}

總結

每天進步一點點,加油!
完整代碼:https://github.com/wx-satellite/go-leetcod…( 如果對你有幫助,記得點個 star 喲 )

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