开始刷leetcode,第一天。
为了练习C语言和python语言的编程能力,以及锻炼算法思想,故而决心开始我的刷题之旅。
今天的题是整数的反转,题目要求如下:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123 输出: 321
示例 2:
输入: -123 输出: -321
示例 3:
输入: 120 输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
好了题目看完了,但是没有太多的思路,后面参照网上各位大佬的代码,发现这玩意儿就是一个数学题啊。
C语言:
int reverse(int x)
{
long long out = 0;
while(x)
{
/*题目的解答中的意思是通过事先的判断,来判决输出out是否溢出,但是实际上对out在定义的时候可
以将out的类型定义为long long类型的,便可以解决溢出的问题
int pop=0;
pop=x%10;
if(out >INT_MAX/10 ||(out <INT_MAX/10&&pop>7) )
return 0;
if(out <INT_MIN/10 ||(out <INT_MIN/10&&pop<-8) )
return 0;
*/
int temp = out*10 + x%10;
if(temp/10 != out)
{
return 0;
}
x = x/10;
out = temp;
}
return out;
}
本来是想通过if语句来判断,但是事实上执行结果要么超时,要么错误。但是事先将out定义为long long类型这个问题,便是解决了。具体的算法实现,最好用笔自己手推一遍。
执行的结果:
执行用时 : 8 ms, 在Reverse Integer的C提交中击败了100.00% 的用户
内存消耗 : 6.5 MB, 在Reverse Integer的C提交中击败了0.98% 的用户
内存偏高了!
python语言实现:
因为自己初学python,所以不得不查很多的资料后注释。
有两个解题思路:
思路一:
将整数先转为字符串格式。再倒序对字符串进行读取。
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
# if x<-2^31 or x>2^31-1:
# return 0
count = 0
#str()将x字符串化
s = str(x)
#若是有第一个字符为负号“-”
if s[0]=='-':
#for循环,i是从len(s)-1里面挨着读起走
for i in range(len(s)-1):
count = count*10+int(s[-1-i])#python的特性,字符串可以从右向左读
if count>2**31:
return 0
return -count
else:
for i in range(len(s)):
count = count*10+int(s[-i-1])
if count>2**31-1:
return 0
return count
其结果:
执行用时 : 60 ms, 在Reverse Integer的Python3提交中击败了99.61% 的用户
内存消耗 : 13.2 MB, 在Reverse Integer的Python3提交中击败了0.97% 的用户
思路二:
将C语言直接转为python,思想不变
#这个比第一个方法,python的特性运用的没那么强烈
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
number = 0
a = abs(x)
while a!=0:
num = a%10
a = int(a/10)
number = number*10 + num
if number > 2**31-1:
return 0
if x<0:
number = -number
return number
执行用时 : 100 ms, 在Reverse Integer的Python3提交中击败了7.78% 的用户
内存消耗 : 13.1 MB, 在Reverse Integer的Python3提交中击败了0.97% 的用户
这种方法耗时,耗空间,不推荐!