题目1
- 题号:7
- 难度:简单
- https://leetcode-cn.com/problems/reverse-integer/
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
示例 4:
输入: 1534236469
输出: 0
示例 5:
输入: -2147483648
输出: 0
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为[−2^31, 2^31 − 1]
。请根据这个假设,如果反转后整数溢出那么就返回 0。
思路1
变成字符串后进行反转操作,再变回会整数。这里要注意的是返回的整数需要满足数值范围
实现1
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
if x >= 0:
s=str(x)
x_ = int (s[::-1])
if x_>2**31 or x_<-2**31:
return 0
else :
return x_
else:
x = - x
s=str(x)
x_=-int(s[::-1])
if x_>2**31 or x_<-2**31:
return 0
else:
return x_
思路二
我们可以一次构建反转整数的一位数字。在这样做的时候,我们可以预先检查向原整数附加另一位数字是否会导致溢出。
反转整数的方法可以与反转字符串进行类比。
我们想重复 “弹出” x 的最后一位数字,并将它 “推入” 到 res 的后面。最后,res 将与 x 相反。
实现二
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
y , res = abs(x) , 0
while y != 0:
res = res*10 + y%10
if res>2**31 -1 :
return 0
y=y//10
return res if x >0 else -res
这题没有考什么深的东西,不过可以复习一下 python 的字符运算语法:
复习一下 python 的位运算符:
(a & b)
按位与运算符:参与运算的两个值,如果两个相应位都为 1,则该位的结果为 1,否则为 0 。
输出结果 12 ,二进制解释: 0000 1100
(a | b)
按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。
输出结果 61 ,二进制解释: 0011 1101
(a ^ b)
按位异或运算符:当两对应的二进位相异时,结果为 1
输出结果 49 ,二进制解释: 0011 0001
(~a )
按位取反运算符:对数据的每个二进制位取反,即把 1 变为 0,把 0 变为 1 。~x 类似于 -x-1
输出结果 -61 ,二进制解释: 1100 0011,在一个有符号二进制数的补码形式。
a << 2
左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补 0。
输出结果 240 ,二进制解释: 1111 0000
a >> 2
右移动运算符:把 “>>” 左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数
输出结果 15 ,二进制解释: 0000 1111
python 赋值运算符:
*= 乘法赋值运算符 c *= a 等效于 c = c * a
/= 除法赋值运算符 c /= a 等效于 c = c / a
%= 取模赋值运算符 c %= a 等效于 c = c % a
**= 幂赋值运算符 c **= a 等效于 c = c ** a
//= 取整除赋值运算符 c //= a 等效于 c = c // a
题目2
- 题号:8
- 难度:中等
- https://leetcode-cn.com/problems/string-to-integer-atoi/
请你来实现一个 atoi
函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
说明:
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−2^31, 2^31− 1]
。如果数值超过这个范围,请返回 INT_MAX (2^31− 1)
或 INT_MIN (−2^31)
。
思路1
利用正则表达式和s.lstrip()方法。
实现1
import re
class Solution(object):
def myAtoi(self, s):
"""
:type s: str
:rtype: int
"""
res = re.findall('^[\+\-]?\d+', s.lstrip())
if res == []:
return 0
x = int(res[0])
if x>2**31-1:
return 2**31 -1
elif x < -2**31 :
return -2 **31
else :
return x
思路2
自动机 后面有时间再补充
题目3
- 题号:9
- 难度:简单
- https://leetcode-cn.com/problems/palindrome-number/
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
思路1
将数字转换为字符串,并检查字符串是否为回文。
利用for 和else语法。
实现1
class Solution(object):
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
s=str(x)
tag = False
for i in range(len(s)//2):
if s[i]!=s[len(s)-i-1]:
break
else: tag = True
return tag
思路2
不转换为字符串时,可以把尾端的数字挨个取出(类似于今天第一题),来判断后半部分和前半部分是否一样(奇数时的中间位置的数字不影响是否为回文数)
可以首先把一定不符合的去掉(负数,个位数是0的数(0除外))
然后从尾部挨个弹出数
假如是奇数的情况下,可以把中间数放在后半部分中,比较的时候比较前半部分数是否等于后半部分数整除10.
实现2
class Solution(object):
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
if x < 0 or (x % 10 == 0 and x != 0):
return False
i, res = x, 0
while i > res:
res = res * 10 + i % 10
i //= 10
return i == res or i == res // 10