Day02
7. 整数反转 (Easy)
- 7. 整数反转 (Easy))
思路:直接把x转化为str进行切片操作。
"""
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为[−2^31,2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回0。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
-2^31 <= x <= 2^31 - 1
"""
class Solution_baoli(object):
# 暴力解法,直接把x转化为str进行切片操作
def reverse(self, x: int) -> int:
"""
:type x: int
:rtype: int
"""
s = str(x)
if s[0] != "-":
s = s[::-1]
x = int(s)
else:
s = s[:0:-1]
x = int(s)
x = -x
return x if -2147483648 < x < 2147483647 else 0
8. 字符串转换整数 (atoi) (Medium)
- 8. 字符串转换整数 (atoi) (Medium)
思路: - 1.循环遍历字符串,直到无法强制转换int
- 2.正则
"""
请你来实现一个atoi函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:
如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0 。
注意:
本题中的空白字符只包括空格字符 ' ' 。
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为[−2^31,2^31 − 1]。如果数值超过这个范围,请返回−2^31 - 1 或 −2^31 。
示例1:
输入: "42"
输出: 42
示例2:
输入: " -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
示例3:
输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。
示例4:
输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。因此无法执行有效的转换。
示例5:
输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。因此返回 INT_MIN (−231) 。
提示:
0 <= s.length <= 200
s 由英文字母(大写和小写)、数字、' '、'+'、'-' 和 '.' 组成
"""
from builtins import str
import re
class Solution(object):
# 思路:循环遍历字符串,直到无法强制转换int
def myAtoi(self, s: str) -> int:
"""
:type s: str
:rtype: int
"""
# 去除左边空字符
s = s.lstrip()
# 判断此时字符串长度,若为0则返回0
if len(s) == 0:
return 0
res = 0
# 如果有符号设置起始位置1,其余的为0
i = 1 if s[0] == "-" or s[0] == "+" else 0
# 循环直到无法强制转换
while i <= len(s):
try:
res = int(s[:i+1])
i += 1
except:
break
if res > 2147483647:
return 2147483647
if res < -2147483648:
return -2147483648
return res
class Solution_re(object):
# 思路:正则
"""
^:匹配字符串开头
[\+\-]:代表一个+字符或-字符
?:前面一个字符可有可无
\d:一个数字
+:前面一个字符的一个或多个
\D:一个非数字字符
*:前面一个字符的0个或多个
"""
def myAtoi(self, s: str) -> int:
"""
:type s: str
:rtype: int
"""
# 去除左边空字符
s = s.lstrip()
# 设置正则规则并查找匹配的内容
res_re = re.findall(r'^[\+\-]?\d+', s)
# 因为res_re的是个列表,解包并且转换成整数
res = int(*res_re)
return max(min(res, 2147483648), -2147483648)
9. 回文数 (Easy)
- 9. 回文数 (Easy)
思路:- 转化字符串:直接暴力、双指针遍历
- 不转化字符串:数学方法
"""
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
"""
class Solution(object):
# 直接暴力
def isPalindrome(self, x: int) -> bool:
"""
:type x: int
:rtype: bool
"""
# x = str(x)
# if x == x[::-1]:
# return True
# else:
# return False
return str(x) == str(x)[::-1]
class Solution_Double_Pointer(object):
# 双指针
def isPalindrome(self, x: int) -> bool:
"""
:type x: int
:rtype: bool
"""
x = str(x)
left, right = 0, len(x) -1
while left <= right:
if x[left] != x[right]:
return False
left += 1
right -= 1
return True
class Solution_Math(object):
# 数学方法
def isPalindrome(self, x: int) -> bool:
# 判断如果x小于0或者x能被10整除但不是0,返回False
if x < 0 or (x % 10 == 0 and x != 0):
return False
# 然后就是把一个数字前后对称位数字构造出来,x是前,res是后
# 因为x可能是偶数位数字或者奇数位数字,如果是偶数位数字,则res==x,res==x代表回文数,如果是奇数位数字,则中间那个数字不考虑,考虑x==res//10,x==res//10代表回文数
res = 0
while x > res:
res = res * 10 + x % 10
x = x // 10
return res == x or x == res // 10
参考资料