美文网首页
7. Reverse Integer

7. Reverse Integer

作者: okerivy | 来源:发表于2017-03-09 14:12 被阅读127次

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

    相关文章

      网友评论

          本文标题:7. Reverse Integer

          本文链接:https://www.haomeiwen.com/subject/ohbwgttx.html