【刷题】LeetCode刷刷刷 — 2021-06-07

简介: 【刷题】LeetCode刷刷刷 — 2021-06-07

一、扑克牌中的顺子


题目描述


从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。
2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。


示例


示例 1:
输入: [1,2,3,4,5]
输出: True
示例 2:
输入: [0,0,1,2,5]
输出: True


解题


class Solution:
    def isStraight(self, nums: List[int]) -> bool:
        nums.sort()
        zero_count = 0
        for i in range(4):
            if nums[i] == 0:
                zero_count += 1
            elif nums[i] == nums[i + 1]:
                return False
        return nums[4] - nums[zero_count] < 5


这题对于不玩牌的人来说,咋一看理解可能比较费劲。其实可以转为,给你随机5个数,看看是不是顺子,比如12345。然后

这其中如果有0,可以看做任意数,0数量最多2个。


此题的关键点是:


  • 知道0的数量
  • 判断是否有0以外重复的数,如果有,就直接返回False
  • 最关键的,还是 当 最大数-最小数 总是要小于 5


二、实现 strStr()


题目描述


实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。
如果不存在,则返回  -1 。
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。


示例


示例 1:
输入:haystack = "hello", needle = "ll"
输出:2
示例 2:
输入:haystack = "aaaaa", needle = "bba"
输出:-1
示例 3:
输入:haystack = "", needle = ""
输出:0


解题


class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        m = len(haystack)
        n = len(needle)
        if n == 0:
            return 0
        for i in range(m):
            if haystack[i:i+n] == needle:
                return i
        return -1


直接暴力破解吧。


比如haystack="hello",needle="ll", 可以知道needle长度是2,那么就for循环hello,看下长度是2子串跟needle是不是相等。


注意下判断空字符串的情况。


三、验证回文串


题目描述


给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。


示例


示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false


解题


class Solution:
    def isPalindrome(self, s: str) -> bool:
        if s == "":
            return True
        temp_list = []
        for i in s:
            if i.isdigit():
                temp_list.append(i)
            if i.isalpha():
                temp_list.append(i.lower())
        return temp_list == temp_list[::-1]


思想就是判断输入的字符串和它的反序是不是相等,但是题目中给出了其他的情况需要考虑:


  • 只考虑字母和数字字符
  • 可以忽略字母的大小写
  • 空字符串定义为有效的回文串


可以遍历字符串,然后把字符放到列表里,注意等于字母时候的处理,统一转成小写,最后与列表的反序相比。


四、字符串相加


题目描述


给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。


示例


提示:
num1 和num2 的长度都小于 5100
num1 和num2 都只包含数字 0-9
num1 和num2 都不包含任何前导零
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式


解题


class Solution:
    def addStrings(self, num1: str, num2: str) -> str:
        cur1 = len(num1) - 1
        cur2 = len(num2) - 1
        carry = 0
        res = ""
        while cur1 >= 0 or cur2 >= 0:
            if cur1 >= 0:
                n1 = int(num1[cur1])
            else:
                n1 = 0
            if cur2 >= 0:
                n2 = int(num2[cur2])
            else:
                n2 = 0
            temp = n1 + n2 + carry
            carry = temp // 10
            res = str(temp % 10) + res
            cur1 -= 1
            cur2 -= 1
        if carry:
            return "1" + res
        else:
            return res


实现竖向相加的过程。


11    // 入参1
+ 123    // 入参2


  • 从个位开始向左,所以定义2个指针分别指到2个输入字符串的末尾。
  • 两数相加,逢10进1。定义变量carry表示是否进1,初始化为0,循环中通过carry = temp // 10
    赋值。
  • 临时相加的和temp等于n1 + n2 + carry,注意这里n1、n2遍历是字符串,要用int()转下,
    才可以与carry相加。
  • 初始化空字符res = "",每次相加的结果除以10,取余数添加到res的前面,res = str(temp % 10) + res
  • 每次循环后,2个指针分别 -1,也就是向左移动 1。
  • 当2个指针任意一个小于0了,就把当前的索引值为0,方便计算。
  • 直到2个指针都小于0,跳出循环。
  • 此时,如果carry!=0,说明进1,结果前面需要加上1,"1" + res,否则直接返回res


五、移动零


题目描述


给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。


示例


示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。


解题


class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        right = left = 0
        while right < n:
            if nums[right] != 0:
                nums[right], nums[left] = nums[left], nums[right]
                left += 1
            right += 1


只能原地移动,考虑使用双指针rightleft,例如输入了[0,1,0,3,12]


  • 初始化right = left = 0
  • right一直向右移动,并且找到非0的元素,找到之后就跟left所在的元素交换位置。
  • 交换位置后,left向右移动1。
相关文章
|
4月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
5月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
137 2
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
72 1
|
4月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
5月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
62 3
|
5月前
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
35 1
|
5月前
|
Python
【Leetcode刷题Python】LeetCode 478. 在圆内随机生成点
本文介绍了LeetCode 478题的解法,题目要求在给定圆的半径和圆心位置的情况下实现在圆内均匀随机生成点的功能,并提供了Python的实现代码。
40 1
|
5月前
|
算法 Python
【Leetcode刷题Python】295. 数据流的中位数
本文介绍了一种使用Python实现的数据结构,用以支持数据流中添加整数并返回当前所有元素的中位数,通过排序列表来计算中位数。
39 1
|
5月前
|
算法 Python
【Leetcode刷题Python】73. 矩阵置零
本文介绍了LeetCode第73题的解法,题目要求在给定矩阵中将所有值为0的元素所在的行和列全部置为0,并提供了一种原地算法的Python实现。
44 0
【Leetcode刷题Python】73. 矩阵置零
|
5月前
|
Python
【Leetcode刷题Python】1467. 两个盒子中球的颜色数相同的概率
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
65 0