我的LeetCode上的反向整数代码不被接受。
我检查了程序是否可以返回正确答案。
class Solution:
def reverse(self, x: int) -> int:
check_num = str(x)
flag = 0
if(check_num[0] == '-'):
check_num = check_num[1:]
flag = 1
elif (check_num[len(check_num)-1] == '0'):
check_num = check_num[:len(check_num)-1]
#print(check_num)
#reverse
time = len(check_num)
storage = [0] * time
for i in range(len(check_num)):
num = len(check_num)-i-1
storage[i] = check_num[num]
#print(storage[i])
if(flag == 1):
storage.insert(0, '-')
#turn to string
oneLinerString=""
for x in storage:
oneLinerString += x
ans = int(oneLinerString)
return oneLinerString
def main():
import sys
import io
def readlines():
for line in io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8'):
yield line.strip('\n')
lines = readlines()
while True:
try:
line = next(lines)
x = int(line);
ret = Solution().reverse(x)
out = str(ret);
print(out)
except StopIteration:
break
if __name__ == '__main__':
main()
对于一种输入方式,我的程序返回正确的输出。
Your input
123
Output
321
Expected
321
但是有错误,我的代码不被接受。 有什么问题,我该如何解决当前的代码?
Finished in N/A
ValueError: invalid literal for int() with base 10: ''
Line 30 in reverse (Solution.py)
Line 47 in main (Solution.py)
Line 55 in <module> (Solution.py)
答案 0 :(得分:1)
对于输入0,由于以下原因,您的代码会将输入转换为空字符串:
elif (check_num[len(check_num)-1] == '0'):
check_num = check_num[:len(check_num)-1]
您应该删除此elif分支,并让最终的整数转换处理反转数字的前导零:
ans = int(oneLinerString) # removes leading zeros in the reversed string
当反转的数字超出32位有符号整数表示的范围时,还需要注意有关返回0的条件。因此,可以添加最终检查:
if not -2**31 <= ans <= 2**31 - 1:
return 0
对示例代码进行最小的更改,一个可行的解决方案是:
class Solution:
def reverse(self, x: int) -> int:
check_num = str(x)
flag = 0
if(check_num[0] == '-'):
check_num = check_num[1:]
flag = 1
#print(check_num)
#reverse
time = len(check_num)
storage = [0] * time
for i in range(len(check_num)):
num = len(check_num)-i-1
storage[i] = check_num[num]
#print(storage[i])
if(flag == 1):
storage.insert(0, '-')
#turn to string
oneLinerString=""
for x in storage:
oneLinerString += x
ans = int(oneLinerString) # removes leading zeros in the reversed string
if not -2**31 <= ans <= 2**31 - 1:
return 0
return ans
答案 1 :(得分:0)
尝试使用python的优势:
def solve():
n = input()
l = list(map(int,str(n)))
l = l[::-1]
#removing leading zeros
i = 0
while l[i] == 0:
i+=1
l = l[i:]
n = ('').join(str(x) for x in l)
return int(n)
if __name__ == "__main__":
print (solve())
答案 2 :(得分:0)
我已将 int 转换为字符串,然后将字符串转换为列表。我可以轻松地反转列表,然后可以按照相同的过程将列表再次转换为 int 对象。
num=-1534236469
sign=1
if num<0:
sign=-1
num=num*-1 # make positive for reverse
list1=list(str(num))
list1.reverse()
numrev=int("".join(str(x) for x in list1))*sign
if numrev.bit_length()>31:
numrev=0
与传统的模除法相比,该算法将花费更多的时间。