LeetCode-7-整数反正-java&python

这篇博客详细介绍了LeetCode第7题‘整数反转’的解题思路与方法,包括Java和Python两种语言的实现。在Java中,通过stringBuffer的reverse方法和求余法解决;Python则利用切片操作实现。博客还讨论了整数类型的边界值和不同整数类型在内存中的表示,如byte、short、int、long以及浮点数的使用场景。

1、题目

https://leetcode-cn.com/problems/reverse-integer/

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1: 输入: 123输出: 321

 示例 2:输入: -123 输出: -321

示例 3:输入: 120 输出: 21

注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

2、实现

分析 :int的取值范围为: -2^31——2^31-1,即-2147483648——2147483647

边界值考虑:-2147483648

java

(一)stringBuffer类的reverse()方法

class Solution {
    public int reverse(int x) {
        //如果x=-2147483648,Math.abs(int x)还是会=-2147483648
        long temp=Math.abs((long)x);
        if(temp>Integer.MAX_VALUE){
            return 0;
        }
        String str=String.valueOf(temp);
        StringBuffer sb= new StringBuffer(str);
        String s=sb.reverse().toString();
        //考虑溢出
        if(Long.parseLong(s)>Integer.MAX_VALUE){
            return 0;
        } else{
            return x>0? Integer.parseInt(s):-Integer.parseInt(s);
        }

    }
}

(二)求余法

class Solution {
    public int reverse(int x) {
        int temp=Math.abs(x);
        long result=0;
        while(temp>0){
            result=result*10+temp%10;
            temp=temp/10;
        }
        if(result>Integer.MAX_VALUE){
            return 0;
        }
        return (int)(x>0?result:-result);
                 
        
    }
}

 

python

class Solution(object):
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        result=0
        if x<0:
            x=-x
            while x!=0:
                result=result*10+x%10
                x=x/10                
            result= -result
        if x>0:
            while x!=0:
                result=result*10+x%10
                x=x/10
            
        if result>pow(2,31)-1 or result<-pow(2,31):
            return 0
        else:
            return result
            

 python的切片

class Solution:
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        res = int(str(x)[::-1]) if x > 0 else -int(str(abs(x))[::-1])
        return res if -pow(2, 31) < res < pow(2, 31)-1 else 0

3、本题用到知识点

 javapython
绝对值函数abs

Math.java

public static int abs(int a) {
    return (a < 0) ? -a : a;
}

/*如果本题中,直接用Math.abs(int x)

如果x=-2147483648,那么Math.abs(-2147483648)=--2147483648=-2147483648 会溢出

*/

//所以本题中应该先把参数转成long 然后调用Math.abs(long) 返回long类型

public static long abs(long a) {
    return (a < 0) ? -a : a;
}

 

 

 

def abs(number): 
    """
    abs(number) -> number
    
    Return the absolute value of the argument.
    """
    return 0

#python是无显式类型的,所以就是取绝对值喽,没有int long 之分,想用就用喽

整型的边界值表示

-2^31——2^31-1,即-2147483648——2147483647

[Integer.MIN_VALUE,Integer.MAX_VALUE]

[-pow(2,31),pow(2,31)-1]
反转小助手

StringBuffer类的reverse()

public synchronized StringBuffer reverse() {
    toStringCache = null;
    super.reverse();
    return this;
}
public AbstractStringBuilder reverse() {
    boolean hasSurrogates = false;
    int n = count - 1;
    for (int j = (n-1) >> 1; j >= 0; j--) {
        int k = n - j;
        char cj = value[j];
        char ck = value[k];
        value[j] = ck;
        value[k] = cj;
        if (Character.isSurrogate(cj) ||
            Character.isSurrogate(ck)) {
            hasSurrogates = true;
        }
    }
    if (hasSurrogates) {
        reverseAllValidSurrogatePairs();
    }
    return this;
}

 

 

#python的切片,轮长度 果然你赢了int(str(x)[::-1])

 

 

 

类型转换

int转long: 

   intx    long t= (long)x

 

long转string:

  s=l+"";

  s=String.valueOf(l);

 

int 转string

第一种方法:s=i+"";
第二种方法:s=String.valueOf(i);

 

String 转int 

第一种方法:i=Integer.parseInt(s);
第二种方法:i=Integer.valueOf(s).intValue();

字符串转成int    int(s)

int转字符串       str(i)

条件语句

iif ( contation){

statement1;

}else{

statement2;

}

三目运算符

 contation ?statement1:statement2

 

statement1 if contation else statement2

4、补充

long 是长整型,在怎么长本身也是整型,12.10的整形部分是12,当然结果是12,

byte: 八位整数 -128——127,可用来节省内存的使用。
short: 16位整数 -32768——32,767,也比较省内存。
int: 32位整数 -2,147,483,648——2,147,483,647,一般来说整数都够用了
long: 64位整数 -9,223,372,036,854,775,808—— 9,223,372,036,854,775,807,一般不需要用
float: 32位浮点,如果浮点需要节省内存用这个。
Double: 64位浮点,一般非整数浮点可用这个。

但是要记住float和double都不是精确的,如果要储存钱一类的必须精确的,用java.math.BigDecimal

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值