Leetcode刷题指南之Python求两数之和【多种思路详解】,判断是否为回文数【将整数转为字符串】【不转为字符串】

简介: 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。

💎一、Leetcode刷题之两数之和

🏆1.两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个
整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] ==9 ,返回 [0, 1] 。
示例 2:

输入:nums = [3,2,4], target = 6 输出:[1,2] 示例 3:

输入:nums = [3,3], target = 6 输出:[0,1]

提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109 只会存在一个有效答案 进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

🏆2.原题链接

来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/two-sum

💎二、解题报告

思路1

循环枚举

🏆1.思路分析

🔑思路:
​ 提示:首先想到的是​ 双重循环遍历数组中的每一个数,枚举出两个数可组成的所有组合,判断组合中两个数相加是否等于target,如果等于就输出下标。
例如[0,1,2,3]
0,1
0,2
0,3
1,2
1,3
2,3
所有组合

🏆2.代码详解

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        for i in range(1,len(nums)):
            for n in range(i):
                if nums[n] +nums[i] == target:
                    return [n,i]

不过有些不清晰,简单修饰后

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        l = len(nums)
        for i in range(l):
            for n in range(i+1,l):
                if nums[i] +nums[n] == target:
                    return [n,i]

🏆3.按步骤分析

提示:

 l = len(nums) 
 求出数组长度
    for i in range(l):
     第一个数从下标为0开始,遍历所有数
        for n in range(i+1,l):
        第一个数从下标为i+1开始,就是读取下标为i+1后面的数
            if nums[i] +nums[n] == target:
            判断两个数是否相加为target
                return n,i
                返回下标

思路2

字典模拟哈希表

🏆1.思路分析

这次我们不找两个数,找一个数,如果第一个数为x,那么y就等于target-x,我们只需找到y是否在列表中,如果在就输出下标。

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        l = len(nums)
        for i in range(l):
            y = target - nums[i]
            for n in range(i+1,l):
                if nums[n] == y:
                    return [n,i]

但是这样还是需要双重循环,没有太大区别!
接下来就用到了字典。
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标.
例如

nums = [10,20,30]
print(enumerate(nums))
结果:
(0 ,10)
(1 ,20)
(2 ,30)

🏆2.代码详解

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        dict = {}
        for v, k in enumerate(nums):
            n = target - k
            if n in dict:
                return [dict[n], v]
            else:
                dict[k] = v

🏆3.按步骤分析

dict = {}
建一个空字典
    for v, k in enumerate(nums):
    循环遍历,为v和k赋值,v为下标,k为数值
        n = target - k
        求数n
        if n in dict:
            return [dict[n], v]
            判断数n是否在字典中,如果在就返回下标。
        else:
            dict[k] = v
            这一步是将遍历过的数和其下标,添加到字典里。因为刚开始字典为空,所以会将两个数中的第一个数添加字典中k代表的字典的key,v代表字典的value,当遍历第二个数时,查询第一个数在字典中,返回这两个数的>下标!

回文数

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

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

例如,121 是回文,而 123 不是。

示例 1:

输入:x = 121
输出:true
示例 2:

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

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

提示:

-231 <= x <= 231 - 1

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/palindrome-number

做题思路

将整数转为字符串,然后用字符串切片逆序输出,比较两者是否相同,如果相同就返回ture,否者返回false。

解题步骤

1.将整数转为字符串

s = str(x)

2.字符串切片逆序输出

s[::-1]

3.比较两者是否相同,如果相同就返回true,否者返回false。

if s == s[::-1]:
            return True
        else:
            return False

代码整合

class Solution(object):
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        s = str(x)
        if s == s[::-1]:
            return True
        else:
            return False

进阶

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

做题思路

官方题解
方法一:反转一半数字
思路

映入脑海的第一个想法是将数字转换为字符串,并检查字符串是否为回文。但是,这需要额外的非常量空间来创建问题描述中所不允许的字符串。

第二个想法是将数字本身反转,然后将反转后的数字与原始数字进行比较,如果它们是相同的,那么这个数字就是回文。
但是,如果反转后的数字大于 \text{int.MAX}int.MAX,我们将遇到整数溢出问题。

按照第二个想法,为了避免数字反转可能导致的溢出问题,为什么不考虑只反转 \text{int}int 数字的一半?毕竟,如果该数字是回文,其后半部分反转后应该与原始数字的前半部分相同。

例如,输入 1221,我们可以将数字 “1221” 的后半部分从 “21” 反转为 “12”,并将其与前半部分 “12” 进行比较,因为二者相同,我们得知数字 1221 是回文。

算法

首先,我们应该处理一些临界情况。所有负数都不可能是回文,例如:-123 不是回文,因为 - 不等于 3。所以我们可以对所有负数返回 false。除了 0 以外,所有个位是 0 的数字不可能是回文,因为最高位不等于 0。所以我们可以对所有大于 0 且个位是 0 的数字返回 false。

现在,让我们来考虑如何反转后半部分的数字。

对于数字 1221,如果执行 1221 % 10,我们将得到最后一位数字 1,要得到倒数第二位数字,我们可以先通过除以 10 把最后一位数字从 1221 中移除,1221 / 10 = 122,再求出上一步结果除以 10 的余数,122 % 10 = 2,就可以得到倒数第二位数字。如果我们把最后一位数字乘以 10,再加上倒数第二位数字,1 * 10 + 2 = 12,就得到了我们想要的反转后的数字。如果继续这个过程,我们将得到更多位数的反转数字。

现在的问题是,我们如何知道反转数字的位数已经达到原始数字位数的一半?

由于整个过程我们不断将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于或等于反转后的数字时,就意味着我们已经处理了一半位数的数字了。

在这里插入图片描述

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/palindrome-number/solution/hui-wen-shu-by-leetcode-solution/
来源:力扣(LeetCode)

解题步骤

根据官方给的题解用Python实现一下
总的来说就是翻转一半的数字,即后半部分。
1.首先将小于0或者能被10整除的整数(不包括0)返回false
大于等于0并且小于10的整数(0到9都是回文数) 返回true

if x < 0 or (x % 10 == 0 and x != 0):
            return False
if x < 10 and x >= 0:
            return True
            

2.翻转后半部分数字

y = 0
while x > y:
    y = y * 10 + x % 10
    x //= 10

x % 10取余
x //= 10取整

3.判断是否相同

  if x == y:
        return True
    else:
        return False

但是当x为奇数时会出现翻转后会多一个0,例如111翻转后为1110
因此需加上多一个判断条件,x == y // 10
又因为0到9也是奇数翻转后多一个0
所以可略去判断 x < 10 and x >= 0

代码整合

class Solution(object):
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        if x < 0 or (x % 10 == 0 and x != 0):
            return False
  
        y = 0
        while x > y:
            y = y * 10 + x % 10
            x //= 10
        if x == y or x == y // 10:
            return True
        else:
            return False
目录
相关文章
|
20天前
|
索引 Python
python字符串类型及操作
本文主要讲解字符串类型的表示、操作符、处理函数、处理方法及格式化。内容涵盖字符串的定义、表示方法(单双引号、三引号)、索引与切片、特殊字符转义、常见操作符(如+、*、in等)、处理函数(如len()、str()、chr()等)、处理方法(如.lower()、.split()等)以及格式化方式(如.format())。通过实例代码详细介绍了字符串的各种用法和技巧,帮助读者全面掌握字符串操作。
python字符串类型及操作
|
4月前
|
Python
在 Python 中,如何将日期时间类型转换为字符串?
在 Python 中,如何将日期时间类型转换为字符串?
173 64
|
2月前
|
存储 人工智能 Python
[oeasy]python061_如何接收输入_input函数_字符串_str_容器_ 输入输出
本文介绍了Python中如何使用`input()`函数接收用户输入。`input()`函数可以从标准输入流获取字符串,并将其赋值给变量。通过键盘输入的值可以实时赋予变量,实现动态输入。为了更好地理解其用法,文中通过实例演示了如何接收用户输入并存储在变量中,还介绍了`input()`函数的参数`prompt`,用于提供输入提示信息。最后总结了`input()`函数的核心功能及其应用场景。更多内容可参考蓝桥、GitHub和Gitee上的相关教程。
35 0
|
3月前
|
存储 测试技术 Python
Python 中别再用 ‘+‘ 拼接字符串了!
通过选择合适的字符串拼接方法,可以显著提升 Python 代码的效率和可读性。在实际开发中,根据具体需求和场景选择最佳的方法,避免不必要的性能损失。
76 5
|
3月前
|
Python
使用Python计算字符串的SHA-256散列值
使用Python计算字符串的SHA-256散列值
90 7
|
13天前
|
机器学习/深度学习 存储 设计模式
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。
|
13天前
|
机器学习/深度学习 数据可视化 TensorFlow
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。
|
1天前
|
Python
[oeasy]python074_ai辅助编程_水果程序_fruits_apple_banana_加法_python之禅
本文回顾了从模块导入变量和函数的方法,并通过一个求和程序实例,讲解了Python中输入处理、类型转换及异常处理的应用。重点分析了“明了胜于晦涩”(Explicit is better than implicit)的Python之禅理念,强调代码应清晰明确。最后总结了加法运算程序的实现过程,并预告后续内容将深入探讨变量类型的隐式与显式问题。附有相关资源链接供进一步学习。
15 4
|
13天前
|
设计模式 机器学习/深度学习 前端开发
Python 高级编程与实战:深入理解设计模式与软件架构
本文深入探讨了Python中的设计模式与软件架构,涵盖单例、工厂、观察者模式及MVC、微服务架构,并通过实战项目如插件系统和Web应用帮助读者掌握这些技术。文章提供了代码示例,便于理解和实践。最后推荐了进一步学习的资源,助力提升Python编程技能。
|
15天前
|
数据采集 搜索推荐 C语言
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化和调试技巧,涵盖使用内置函数、列表推导式、生成器、`cProfile`、`numpy`等优化手段,以及`print`、`assert`、`pdb`和`logging`等调试方法。通过实战项目如优化排序算法和日志记录的Web爬虫,帮助你编写高效稳定的Python程序。

热门文章

最新文章