LeetCode #Reverse Number#


 LeetCode #Reverse Number#




刚背了单词,然后做个题玩玩~挑个软柿子踩踩~哈哈


很简单的思路.不过好玩的是我忘记检查处理完的数据是否符合整形数据返回了.因而好一会儿不能AC.

感谢 @Fantasy. 很快的指出我没有检查返回数据的范围.


先给出我超丑陋的解(python), 而后给出其他高手给出的很优雅的解!!也是用python

最后会给出利用java和C/C++的解.


"""
Programmer : EOF
Date : 2015.03.31
File   :  reverse_interger.py
"""

class Solution:
    # @return an integer
    def reverse(self, x):
		buffer =[]
		
		INT_MAX = 0x7fffffff

		INT_MIN = (-INT_MAX - 1)
		
		if x > INT_MAX or x < INT_MIN :
		    return 0

		if x > 0 :
			tmp = x
			counter = 1
			while tmp > 0 :
				counter += 1
				buffer.append(tmp % 10);
				tmp /= 10

			tmp = 0
			for i in range(0, len(buffer)) :
				tmp *= 10
				tmp += buffer[i]

			if tmp > INT_MAX or tmp < INT_MIN :
				return 0
		    
			return tmp

		elif x < 0 :
			tmp = -x
			counter = 1
			while tmp > 0 :
				counter += 1
				buffer.append(tmp % 10);
				tmp /= 10

			tmp = 0
			for i in range(0, len(buffer)) :
				tmp *= 10
				tmp += buffer[i]

			if tmp > INT_MAX or tmp < INT_MIN :
				return 0
		        
			return -tmp

		else:
			return 0

#--------------------------just for testing ----------------------------

s = Solution()

print s.reverse(123)


... 确实好搓就很简单做一下很基础的数学运算,利用余数和商的特性,把结果保存在list中.而后逆序的组合成整数,最后别忘记重新检查整数是否符合要求,是否越界!!


下面给出别人很优雅的解:

class Solution:
  # @return an integer
  def reverse(self, x):
    if x<0:
      sign = -1
    else:
      sign = 1
    strx=str(abs(x))
    r = strx[::-1]
    return sign*int(r)

简直不能再短..帅的飞起

先强转成字符串,而后在利用python切片的技巧,逆序输出字符,然后再int()强转,限定好整数范围.

最后恢复数据的符号.


java解(来源于@凯旋冲锋):利用了内置整形的特性

package reverse_integer;

public class Solution {
	public int reverse(int x) {
		long r = 0;
		while (x != 0) {
			r = r * 10 + x % 10;
			x /= 10;
		}
		return r > Integer.MAX_VALUE || r < Integer.MIN_VALUE ? 0 : (int) r;
	}

	public static void main(String[] args) {
		System.out.println(new Solution().reverse(1563847412));
	}
}


最后献上皓神的解答,C语言实现.

自己抽自己一巴掌,擦,居然没看清楚皓神写的注释!!

Did you notice that the reversed integer might overflow? Assume the input is a 32-bit integer,


// Source : https://oj.leetcode.com/problems/reverse-integer/
// Author : Hao Chen
// Date   : 2014-06-18

/********************************************************************************** 
* 
* Reverse digits of an integer.
* 
* Example1: x =  123, return  321
* Example2: x = -123, return -321
* 
* 
* Have you thought about this?
* 
* Here are some good questions to ask before coding. Bonus points for you if you have already thought through this!
* 
* > If the integer's last digit is 0, what should the output be? ie, cases such as 10, 100.
* 
* > Did you notice that the reversed integer might overflow? Assume the input is a 32-bit integer, 
*   then the reverse of 1000000003 overflows. How should you handle such cases?
* 
* > Throw an exception? Good, but what if throwing an exception is not an option? 
*   You would then have to re-design the function (ie, add an extra parameter).
* 
*               
**********************************************************************************/

#include <stdio.h>
#include <stdlib.h>

//Why need the INT_MIN be defined like that?
//Please take a look: 
//  http://stackoverflow.com/questions/14695118/2147483648-0-returns-true-in-c
#define INT_MAX     2147483647
#define INT_MIN     (-INT_MAX - 1)
int reverse(int x) {
    int y=0;
    int n;
    while( x != 0){
        n = x%10;
        //Checking the over/underflow.
        //Actually, it should be y>(INT_MAX-n)/10, but n/10 is 0, so omit it.
        if (y > INT_MAX/10 || y < INT_MIN/10){
             return 0;
        }
        y = y*10 + n;
        x /= 10;
    }
    return y;
}

#define TEST(n, e)  printf("%12d  =>  %-12d    %s!\n",  n, reverse(n),  e == reverse(n)?"passed":"failed")

int main(int argc, char**argv)
{
    //basic cases
    TEST(  123,  321);
    TEST( -123, -321);
    TEST( -100,   -1);
    TEST( 1002, 2001);
    //big integer
    TEST( 1463847412,  2147483641);
    TEST(-2147447412, -2147447412);
    TEST( 2147447412,  2147447412);
    //overflow
    TEST( 1000000003, 0);
    TEST( 2147483647, 0);
    TEST(-2147483648, 0);
    //customized cases
    if (argc<2){
        return 0;
    }
    printf("\n");
    for (int i=1; i<argc; i++) {
        int n = atoi(argv[i]); 
        printf("%12d  =>  %-12d    %s!\n",  n, reverse(n), reverse(reverse(n))==n ? "passed":"failed");
    }
    return 0;
}












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值