第二天

题目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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值