【LeetCode】 #9:迴文數 C語言

最近打算練習寫代碼的能力,因此從簡單題開始作。
大部分仍是用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

總結

在簡單問題上,不只要注意到問題的解決,還要注重方法的效率問題,嘗試用多種方法來解決。

相關文章
相關標籤/搜索