【DW组队学习—LeetCode】day02

7. 整数反转

题目要求

给出一个 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

【DW组队学习—LeetCode】day02_第1张图片

【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]

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:

【示例 5】输入: “-91283472332” 输出: -2147483648

解释: 数字 “-91283472332” 超过 32位有符号整数范围。 因此返回 INT_MIN (−231) 。

提示:

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

尝试思路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

错误:空字符串没能转换
原因:在判断逻辑上有漏洞
【DW组队学习—LeetCode】day02_第2张图片
尝试思路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

错误:没有识别正号,此外,自已发现还有很多情况没有被包含在内,比如数字后面加空格加数字的情况,该代码不会成功识别
【DW组队学习—LeetCode】day02_第3张图片
尝试思路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

【DW组队学习—LeetCode】day02_第4张图片
【总结】在过程中一开始的方案其实很多情况都没有考虑到,所以提交了很多次碰到特殊案例就出错,比如空字符串、正负号同时出现等情况,改了很多次。后来写手稿画图之后才比较完整,一次就过了,还是需要多练习。

9. 回文数

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

【示例 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

【DW组队学习—LeetCode】day02_第5张图片
发现内存占比略大,觉得应该是设置了两个变量,间接比较浪费了空间,而且多了两个步骤浪费时间,所以简化了代码,用时和内存消耗均有提升,特别是用时:

class Solution:
    def isPalindrome(self, x: int) -> bool:
        return str(x) == str(x)[::-1]

【DW组队学习—LeetCode】day02_第6张图片
进阶问题尝试思路:
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

【DW组队学习—LeetCode】day02_第7张图片
【总结】今天的题目比昨天的简单些,起码都做出来了,虽然很多笨方法,简单看了一眼平台上的题解,感觉可能我写了一大段人家一句就写完了。但是现在的水平还是要求能做出来,然后在精炼。继续加油!

你可能感兴趣的:(DW组队学习,LeetCode,Python,leetcode)