DW&LeetCode_day2(7、8、9)

DW&LeetCode_day2(7、8、9)


写在前面:

  • 第一天的内容已经打卡完成,看到大家的新思路,突然就清晰了,开始第二天的内容啦!各位小伙伴加油哦!

开源内容

开源内容

学习大纲 


目录

DW&LeetCode_day2(7、8、9)

写在前面:

开源内容

学习大纲 

7. 整数反转

python 的位运算符:

python 赋值运算符:

8. 字符串转换整数 (atoi)

解释正则表达式 

9. 回文数

写在最后:


 


 

20天,每天平均花费时间2小时-5小时不等,根据个人学习接受能力强弱有所浮动。


7. 整数反转

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
 

示例 1:

输入:x = 123
输出:321


示例 2:

输入:x = -123
输出:-321


示例 3:

输入:x = 120
输出:21


示例 4:

输入:x = 0
输出:0
 

提示:

-231 <= x <= 231 - 1


链接:题目链接

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

注意:

python中 取摸 取整除 需要注意 和java不一样

python 中 -1%10 = 9  , -1//10=-1
java   中 -1%10 = 1  , -1//10=0

题解:

    def reverse(self, x: int) -> int:
        sign = x >= 0                   # 判断x正负
        maxInt32 = (1 << 31) - 1        # 初始化int32最大值
        res = 0                         # 初始化为0
        if x == - 1 << 31: return 0     # 若x为负int32最小值,则反转后必定溢出,其余负数情况和正数是对称的
        x = abs(x)                      # 将x转为正数来处理
        while x != 0:                   # 只要还没有结束pop
            pop = x % 10                # 最后一位为x的pop
            x //= 10                    # 这时去掉最后一位
            if res > maxInt32 // 10 or res == maxInt32 // 10 and pop > 7: return 0
# 当result已经大于最大值//10,或者等于int32最大值//10并且当前pop出的值大于7时,必定溢出,返回0 
# 如果不溢出,则把pop出的值加进result中
            res = res * 10 + pop
        # 最后返回带正负号的result    
        return res if sign else -res
# 字符串切片处理

class Solution:
    def reverse(self, x):
        if x >= 0:
            x = int(str(x)[::-1])
        else:
            x = -int(str(x)[1:][::-1])
        return x if x >=2147483647 or x <= -2147483648 else 0
        
class Solution:
    def reverse(self, x):
        r = x // max(1, abs(x)) * int(str(abs(x))[::-1])   #0:x为0, 1:x为正, -1:x为负,再进行序列反转
        return r if r.bit_length() < 32 or r == -2**31 else 0 #2^31 和 -2^31 的比特数为32,其中正负号占用了一位
class Solution:
    def reverse(self, x: int) -> int:
        return (x//abs(x) * int(str(abs(x))[::-1])if x else 0) if -1<<31 < (x//abs(x) * int(str(abs(x))[::-1])if x else 0) < (1<<31)-1 else 0

# int(str(abs(x))[::-1]) 这句可以输出 x 的无符号的反转,先把整数转字符串,在把字符串反转,再把字符串转整数
# x = x//max(1, abs(x)) * int(str(abs(x))[::-1])溢出则返回0
# x//abs(x) 用于得到 x 的符号,但是对 0 不适用,所以得加 if else 表达式判断一下
# int((x+0.1)//abs(x+0.1)) 用于得到 x 的符号,由于 x 是整数,加个 0.1 不会改变符号,并解决了除 0 的问题
# 最后使用 if else 表达式判断范围是否在 int32 内
# 极简解法
return (int(str(abs(x))[::-1])*(-1 if x < 0 else 1)) if -2**31 <= (int(str(abs(x))[::-1])*(-1 if x < 0 else 1)) <= 2**31-1 else 0

 

DW&LeetCode_day2(7、8、9)_第1张图片

 

8. 字符串转换整数 (atoi)

请你来实现一个 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:

输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。 
     因此返回 INT_MIN (−231) 。
 

提示:

0 <= s.length <= 200
s 由英文字母(大写和小写)、数字、' '、'+'、'-' 和 '.' 组成

解释正则表达式 

^[\\+\\-]?\\d+

^ 表示匹配字符串开头,我们匹配的就是 '+'  '-'  号

[] 表示匹配包含的任一字符,比如[0-9]就是匹配数字字符 0 - 9 中的一个

? 表示前面一个字符出现零次或者一次,这里用 ? 是因为 '+' 号可以省略

 \\d 表示一个数字 0 - 9 范围

+ 表示前面一个字符出现一次或者多次,\\d+ 合一起就能匹配一连串数字了
# TS解法
function myAtoi(str: string): number {
  const MAX = 2 ** 31 - 1;
  const MIN = -(2 ** 31);
  // 与之后面尽可能多的连续数字字符组合起来
  if (Number.isNaN(parseInt(str))) {
    return 0;
  } else {
    let res = parseInt(str);
    if (res > MAX) {
      return MAX;
    } else if (res < MIN) {
      return MIN;
    } else {
      return res;
    }
  }
};
// 在 parseInt 转换失败的基础上加一个处理,与之后面尽可能多的连续数字字符组合起来

DW&LeetCode_day2(7、8、9)_第2张图片

 要注意,Golang 中的 := 叫短变量声明,意思是声明并初始化,它和 Python 中的 := 不是一个概念

# python解法
return min(max(int(x.group(0)) if (x:=re.match("[ ]*[\+\-]?\d+",str)) else 0 ,y:=-2**31),-y-1)
#  正则表达式和Assignment Expressions运算符

DW&LeetCode_day2(7、8、9)_第3张图片

9. 回文数

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:

输入: 121
输出: true


示例 2:

输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。


示例 3:

输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:

你能不将整数转为字符串来解决这个问题吗?


链接:题目链接

    # python 解法
    def isPalindrome(self,x:int)->bool:
        a = str(x)
        b = (len(a))//2
        return a[:b] == a[-1:-b-1:-1]
# 直接把数字转成字符串,然后直接比较字符串
# 因为Python中字符串可以看作是一个不可变的序列,因此可以使用切片 s[::-1] 将 s 翻转,然后判断即可
return (x >= 0) and (x == int(str(x)[::-1]))

DW&LeetCode_day2(7、8、9)_第4张图片

写在最后:

"keep it simple & stupid","简洁胜于复杂,编程不是为了炫耀聪明和晦涩的语法,而是为了让你的代码可以清楚的表达它们的目的"

 

你可能感兴趣的:(LeetCode题解,python)