最近打算練習寫代碼的能力,因此從簡單題開始作。
大部分仍是用C語言來解決。
@(解法)函數
判斷一個整數是不是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是同樣的整數。ui
示例 1:
輸入: 121
輸出: true
示例 2:
輸入: -121
輸出: false
解釋: 從左向右讀, 爲 -121 。 從右向左讀, 爲 121- 。所以它不是一個迴文數。
示例 3:
輸入: 10
輸出: false
解釋: 從右向左讀, 爲 01 。所以它不是一個迴文數。.net
具體連接 https://leetcode-cn.com/problems/palindrome-number/code
這與#7很類似,可是須要考慮方法的效率問題。htm
初步的想法就是用一個while循環,在循環裏面解決取餘和倒序相加的工做。以後再用一個循環進行首尾比較。blog
具體代碼以下:leetcode
bool isPalindrome(int x) { if (x < 0 || x%10 == 0 && x != 0) return 0; if (x / 10 == 0) return 1; int a[20] = { 0 }, n = 0; while (x) { a[n] = x % 10; x = x / 10; n++; } for (int i = 0; i < n / 2; i++){ if (a[i] != a[n-1-i]) return 0; } return 1; }
須要注意的是,咱們能夠預先對數據進行判斷,好比負數必定不是迴文數,數字末尾爲0的非0數也必定不是迴文數,只有一位的數字必定是迴文數。、字符串
在看了官方題解後,提到了將數字自己反轉,而後將反轉後的數字與原始數字進行比較,若是它們是相同的,那麼這個數字就是迴文。it
bool isPalindrome(int x) { if (x < 0 || x%10 == 0 && x != 0) return 0; if (x / 10 == 0) return 1; int rev = 0; while (x > rev) { rev = x % 10 + rev * 10; x = x / 10; } return x == rev || x == rev / 10; }
須要注意的是因爲預先不知道x是奇數位仍是偶數位,因此最後的比較條件裏出現了 x==rev/10.
題目中也有提到將數字轉換爲字符串,我一開始想到用itoa,可是leetcode不支持這個函數,因此選用了sprintf來進行轉換。
bool isPalindrome(int x) { if (x < 0 || x % 10 == 0 && x != 0) return 0; char a[20] = { 0 }; sprintf_s(a,"%d",x); for (int i = 0; i< (strlen(a) / 2); i++){ if (a[i] != a[strlen(a) - 1 - i]) return 0; } return 1; }
參考連接
http://www.cnblogs.com/sddai/p/5774121.html
https://blog.csdn.net/xiaotaiyangzuishuai/article/details/79205773
在簡單問題上,不只要注意到問題的解決,還要注重方法的效率問題,嘗試用多種方法來解決。