Swift 3.0
//
// E_7_ReverseInteger.swift
// AlgorithmLeetCode
//
// Created by okerivy on 2017/3/9.
// Copyright ? 2017年 okerivy. All rights reserved.
// https://leetcode.com/problems/reverse-integer
import Foundation
// MARK: - 題目名稱: 7. Reverse Integer
/* MARK: - 所屬類別:
標簽: Math
相關題目:
(M) String to Integer (atoi)
*/
/* MARK: - 題目英文:
Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
Note:
The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.
*/
/* MARK: - 題目翻譯:
反轉整數的數字。
例1: x = 123, 返回 321
例2: x = -123, 返回 -321
在寫代碼之前,你考慮過下面的這些問題嗎?
假如數字的最后一位是0,應該輸出什么呢?例如10,100。
你注意到反轉整數可能會導致溢出嗎?假設輸入是32位的整數(范圍是-2147483648到2147483647),反轉整數1000000003得到的結果3000000001會導致溢出。你應該如何處理這種情況呢?
對于上面的情況,當反轉整數發生溢出的時候,你的函數應該返回0。
*/
/* MARK: - 解題思路:
反轉正整數難度不大,我們很快就會有思路。
先拿一個簡單的例子分析一下,例如反轉123,計算過程為
((3 * 10 + 2)*10 + 1) = 321
即計算過程為不斷的乘10再加上剩余的數字余10得到的數字。
其實上面的這種思路對于負數來說,其實同樣適用。例如反轉-123的計算過程如下:
(-3 * 10 +(-2)) * 10 + (-1) = -321
不要忘記了題目中提到的整數溢出的問題,其實有一個很巧妙的方式來實現。
下面是代碼中得到newResult的計算方式: result = result * 10 + num % 10
為了不發生溢出,我們可以對臨界條件進行判斷,發生溢出的情況如下
while循環里 result = result * 10 + num % 10
result 每次都乘以10,可能會導致整數溢出
while循環里會先判斷 result > (Int(Int32.max) - num % 10) / 10 是否會導致溢出
如果會的話直接就返回0了
*/
/* MARK: - 復雜度分析:
時間復雜度:O(lgn) 空間復雜度:O(1)
*/
// MARK: - 代碼:
private class Solution {
func reverse(_ x: Int) -> Int {
// 以前的數字
var num = x
// 結果
var result = 0
// 判斷num 是否 等于 0 代表已經計算完畢
while num != 0 {
// 如果結果 溢出 直接返回 0
// 這個公式是根據這個 result = result * 10 + num % 10 公式推導的
if result > (Int(Int32.max) - num % 10) / 10 {
return 0
}
// 如果不會溢出, 繼續計算
result = result * 10 + num % 10
// 計算下一位
num = num / 10
}
return result
}
}
// MARK: - 測試代碼:
func reverseInteger() {
print(Solution().reverse(123))
print(Solution().reverse(-123))
print(Solution().reverse(1534236469))
}
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。