7. Reverse Integer[E]整数反转

题目


Given a 32-bit signed integer, reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123,return -321
Example3: x = 120, return 21

思路


问题的关键在于对溢出的判断。

思路1:用long或者long long

直接用long或者long long计算,这样就保证不会溢出,再判断反转后的数字是否溢出。

思路2:stoi()

通过字符串转换,由于stoi()函数会作int范围检查,利用异常处理机制。

思路3:字符串分片(python)

python中int都是长整型,可以通过直接比较32位整数大小来判断是否溢出。通过字符串分片来完成反转。

Tips


C++知识

  • integer范围:\(-2^{31} \sim 2^{31}-1\)
  • short为半个机器字长,int为一个机器字长,long类型为一个或者两个机器字长
  • stoi()字符处理函数,将数字字符串转换成int输出,并且对作范围检查,默认范围是在int范围内,如果超出范围会runtime error。

整数翻转

通过取余操作读取当前输入x的个位数,放到反转后的整数s的末位,通过s*10加上x的末位得到新的s,相当于将x左移一位。再通过x=x/10的操作,使得x右移一位,x的个位数到了小数位被强制类型转换掉了,再取余得到新的个位数。

判断溢出

  • 与INT_MAX、INT_MIN作比较
  • 对数作一些运算,如果溢出了,那么运算后的值作反向操作会和之前的值不一样。

Python知识

字符串的分片

  • 有三个被索引运算符(:)分开的数字,第一个数字是起始值,默认是字符串的起始位置,即索引为0;第二个数字是结束值,默认是字符串的末尾字符;第三个数字是步长,默认为1。
  • 步长为-1时,python认为是向后进行
  • python采用的是半开区间,包含范围的起始值,但是不包含结束值。

C++


  • 思路1
int reverse(int x){
  long long res=0;
  while(x!=0){
    int t = res * 10 + x % 10;
    if(t /10 != res)
      return 0;
    res = t;
    t /= 10;
  }
  return res;
}
  • 思路2
int reverse(int x){
  std::string str = std::to_string(x);
  if(str[0] == '-')
    std::reverse(str.begin()+1,str.end());
  else
    std::reverse(str.begin(),str.end());
  try{
    return stoi(str);
  }
  catch(out_of_range ex){
    return 0;
  }
}

python

def reverse(self, x):
  if x >= 0:
    s = (int)(str(x)[::-1])  
  else:
    s = -(int)(str(-x)[::-1])
  if s >= -(2**31) and s <= (2**31)-1:
    return s
  else:
    return 0
posted @ 2019-06-09 14:32  风雪初晴,宜下江南  阅读(215)  评论(0编辑  收藏  举报