题目要求
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
注意: 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
【示例 1】 输入:x = 123 输出:321
【示例 2】 输入:x = -123 输出:-321
【示例 3】 输入:x = 120 输出:21
【示例 4】 输入:x = 0 输出:0
提示:
-2^31 <= x <= 2^31 - 1
尝试思路:转换成字符串
1、判断x的符号,存放起来
2、取|x|,转换成字符串形式,将字符串反转
3、连接符号,将字符串转换成有符号整数格式y
4、判断y的大小,超出范围直接返回0,否则返回y
代码:
class Solution:
def reverse(self, x: int) -> int:
s = ""
#判断正负
if x < 0:
s = "-"
#字符串反转
str_x = str(abs(x))[::-1]
#连接符号,变为带符号整数
int_x = int(s+str_x)
#判断x的大小
if int_x < -pow(2,31) or int_x > pow(2,31) - 1:
return 0
else:
return int_x
【VC小注】实现字符串反转的几种方法:
法1:使用字符切片(如上)
法2:使用列表的reverse方法
#法2:使用列表的reverse方法
list_x = list(str(abs(x)))
list_x.reverse()
str_x = "".join(list_x)
法3:切片+列表
#法3:切片+列表
list_x = list(str(abs(x)))
str_x = "".join(list_x[::-1])
法4:循环
#法4:循环
str_x = ""
str_y = str(abs(x))
l = len(str_y)
for i in range(l):
str_x = str_x + str_y[l-i-1]
题目要求
请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:
- 如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
- 假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
- 该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0 。
注意:
本题中的空白字符只包括空格字符 ’ ’ 。 假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 −1]。如果数值超过这个范围,请返回 231 − 1 或 −231 。
【示例 1】输入: “42” 输出: 42
【示例 2】输入: “-42” 输出: -42解释: 第一个非空白字符为 ‘-’, 它是一个负号。我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
【示例 3】输入: “4193 with words” 输出: 4193
解释: 转换截止于数字 ‘3’ ,因为它的下一个字符不为数字。
【示例 4】输入: “words and 987” 输出: 0
解释: 第一个非空字符是 ‘w’, 但它不是数字或正、负号。因此无法执行有效的转换。 示例 5:
【示例 5】输入: “-91283472332” 输出: -2147483648
解释: 数字 “-91283472332” 超过 32位有符号整数范围。 因此返回 INT_MIN (−231) 。
提示:
- 0 <= s.length <= 200 s
- 由英文字母(大写和小写)、数字、’ ‘、’+’、’-’ 和 ‘.’ 组成
尝试思路1:
1、设置标识符,默认为0,表示没有遇上数字
2、依次判断字符串x中的字符,如果不是’ ‘、数字或’-’,且标识符为0,直接返回0,反之继续判断下一位
3、如果当前是’ ‘,则跳过;如果当前是’-'或数字,则保存到y,且若是数字标识符变为1
4、如果当前位是非数字,且标识符为1,则退出循环
5、判断该数字是否在范围内,返回int_max或者int_min或者int(y)
class Solution:
def myAtoi(self, s: str) -> int:
int_max = pow(2, 31) - 1
int_min = -pow(2, 31)
y = ''
label = 0
for x in s:
if x == ' ' or (x >= '0' and x <= '9') or x == '-':
if x == ' ':
continue
elif (x >= '0' and x <= '9'):
label = 1
y = y + x
elif x == '-':
y = y + x
else:
if label == 0:
return 0
else:
break
int_y = int(y)
if int_y < int_min:
return int_min
elif int_y >int_max:
return int_max
else:
return int_y
错误:空字符串没能转换
原因:在判断逻辑上有漏洞
尝试思路2:
(设置标识符,默认为0,表示y中有无数字)
1、判断字符x
2.1、x是‘ ’,跳过(continue)
2.2、x是‘-’,加入y,判断下一字符,重复步骤1
2.3、x是数字,加入y,标识符变为1,判断下一字符,重复步骤1
2.4、x是非上述字符(或结束),则退出循环(或自动结束循环)
3.1、y中有数字(标识符为1),则转换输出,且须判断y的大小是否超过范围
3.2、y中无数字(标识符为0),输出0
代码:
class Solution:
def myAtoi(self, s: str) -> int:
int_max = pow(2, 31) - 1
int_min = -pow(2, 31)
y = ''
label = 0
for x in s:
if x == ' ':
continue
elif x == '-':
y = y + x
elif x >= '0' and x <= '9':
y = y + x
label = 1
else:
break
if label == 1:
int_y = int(y)
if int_y > int_max:
int_y = int_max
elif int_y < int_min:
int_y = int_min
return int_y
else:
return 0
错误:没有识别正号,此外,自已发现还有很多情况没有被包含在内,比如数字后面加空格加数字的情况,该代码不会成功识别
尝试思路3:
(设置数字标识符,默认0表示前面没有数字;设置符号标识符,默认空,表示前面没有符号)
1、字符x
2、判断数字标识符和符号标识符
2.1 若都为0,则‘ ’跳过,正负号和数字计入y,重复步骤1,其他字符则结束循环
2.2 其他情况均只能计入数字,其他都结束循环
3、判断数字标识符和符号标识符确定输出
3.1 都没有或者有符号没数字,输出0
3.2 都有或者有数字没符号,判断是否超出范围,输出数字
代码:
class Solution:
def myAtoi(self, s: str) -> int:
int_max = pow(2, 31) - 1
int_min = -pow(2, 31)
y = ''
label, carry = 0, 0
for x in s:
if label == 0 and carry == 0:
if x == ' ':
continue
elif x == '-' or x == '+':
y = y + x
carry = 1
elif (x >= '0' and x <= '9'):
label = 1
y = y + x
else:
break
else:
if (x >= '0' and x <= '9'):
label = 1
y = y + x
else:
break
if (label == 0 and carry == 0) or (label == 0 and carry == 1):
return 0
else:
int_y = int(y)
if int_y > int_max:
int_y = int_max
elif int_y < int_min:
int_y = int_min
return int_y
【总结】在过程中一开始的方案其实很多情况都没有考虑到,所以提交了很多次碰到特殊案例就出错,比如空字符串、正负号同时出现等情况,改了很多次。后来写手稿画图之后才比较完整,一次就过了,还是需要多练习。
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
【示例 1】输入: 121 输出: true
【示例 2】输入: -121 输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
【示例3】输入: 10 输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
尝试思路:
将整数转化为字符串,判断原字符串和翻转字符串是否相同
代码:
class Solution:
def isPalindrome(self, x: int) -> bool:
s_x = str(x)
rs_x = s_x[::-1]
return s_x == rs_x
发现内存占比略大,觉得应该是设置了两个变量,间接比较浪费了空间,而且多了两个步骤浪费时间,所以简化了代码,用时和内存消耗均有提升,特别是用时:
class Solution:
def isPalindrome(self, x: int) -> bool:
return str(x) == str(x)[::-1]
进阶问题尝试思路:
1、判断正负,若为负直接false,为正继续操作
2、不断除以10取余,得到余数列表,判断翻转列表比较与原列表是否相同
代码:
class Solution:
def isPalindrome(self, x: int) -> bool:
l = []
if x < 0:
return False
else:
while x // 10 != 0:
y = x % 10 #余数部分
x = x // 10 #整数部分
l.append(y)
l.append(x % 10)
rl = l[::-1]
return True if rl == l else False
【总结】今天的题目比昨天的简单些,起码都做出来了,虽然很多笨方法,简单看了一眼平台上的题解,感觉可能我写了一大段人家一句就写完了。但是现在的水平还是要求能做出来,然后在精炼。继续加油!