7. Reverse Integer

2017-03-09  本文已影响127人  okerivy

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))
    
}



上一篇下一篇

猜你喜欢

热点阅读