9. Palindrome Number

Swift 3.0


//
//  E_9_PalindromeNumber.swift
//  AlgorithmLeetCode
//
//  Created by okerivy on 2017/3/9.
//  Copyright ? 2017年 okerivy. All rights reserved.
//  https://leetcode.com/problems/palindrome-number

import Foundation




// MARK: - 題目名稱: 9. Palindrome Number 

/* MARK: - 所屬類別:
 標(biāo)簽: Math
 
 相關(guān)題目:
  (E) Palindrome Linked List
 
 */

/* MARK: - 題目英文:
 Determine whether an integer is a palindrome. Do this without extra space.
 
 
 Some hints:
 Could negative integers be palindromes? (ie, -1)
 
 If you are thinking of converting the integer to string, note the restriction of using extra space.
 
 You could also try reversing an integer. However, if you have solved the problem "Reverse Integer", you know that the reversed integer might overflow. How would you handle such case?
 
 There is a more generic way of solving this problem.
 
 */


/* MARK: - 題目翻譯:
 
 判斷一個整數(shù)是不是回文數(shù)。不要用到而外的空間來解決這道題目(通常意味著空間復(fù)雜度為O(1))。
 
 一些提示:
 負(fù)整數(shù)會是回文數(shù)嗎?(例如-1)
 
 如果你在考慮將整數(shù)轉(zhuǎn)換為字符串,注意不要使用額外空間的限制條件。
 
 你也可以嘗試反轉(zhuǎn)一個整數(shù)。然而,如果你已經(jīng)解決了 "反轉(zhuǎn)整數(shù)" 這個問題,你會知道反轉(zhuǎn)整數(shù)可能會導(dǎo)致溢出。你會如何處理這些情況?
 
 */



/* MARK: - 解題思路:
 
 負(fù)數(shù)不是回文 0 是回文
 
 為了防止溢出,我們只需要計算整數(shù)右半部分的值,和左半部分進行對比即可判斷是否是回文數(shù)。

 循環(huán)結(jié)束的時候會有兩種情況:
 
 若原先的整數(shù)長度為奇數(shù)的時候,需要判斷 num == rightHalf / 10 。例如對于整數(shù)12121,循環(huán)結(jié)束的時候,num == 12,rightHalf == 121。
 若原先的整數(shù)長度為偶數(shù)的時候,需要判斷 num == rightHalf 。例如對于整數(shù)1221,循環(huán)結(jié)束的時候,num == 12,rightHalf == 121。
 
 */

// FIXME: 沒有完成
/* MARK: - 復(fù)雜度分析:
 時間復(fù)雜度: logN
 
 */


// MARK: - 代碼:
private class Solution {
    
    func isPalindrome(_ x: Int) -> Bool {
        
        // 如果是負(fù)數(shù) 直接返回
        if x < 0 {
            return false
        }
        
        // 需要處理的數(shù)據(jù)
        var num = x
        // 右邊的數(shù)據(jù)
        var rightHalf = 0
        
        // 判斷 是否已經(jīng)把右邊數(shù)據(jù)處理完成了
        while num > rightHalf {
            // 通過對num 右邊的數(shù)據(jù)進行翻轉(zhuǎn) 
            // 將來可以和左邊的數(shù)據(jù)進行比較
            rightHalf = rightHalf * 10 + num % 10
            // 指向下一位
            num /= 10
        }
        
        // 判斷左右兩邊是否相等 主要是奇數(shù)和偶數(shù)的差別
        return num == rightHalf || (num == rightHalf / 10)
        
       
    }
}



// MARK: - 測試代碼:
func palindromeNumber() {
    
    print(Solution().isPalindrome(-2))
    print(Solution().isPalindrome(0))
    print(Solution().isPalindrome(2))
    print(Solution().isPalindrome(12321))
    print(Solution().isPalindrome(123321))
    
}




最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容