刷题LeetCode刷刷刷 — 2021-06-01

Posted 把苹果咬哭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题LeetCode刷刷刷 — 2021-06-01相关的知识,希望对你有一定的参考价值。

一、旋转字符串

题目描述

给定两个字符串, A 和 B。

A 的旋转操作就是将 A 最左边的字符移动到最右边。 例如, 若 A = \'abcde\',在移动一次之后结果就是\'bcdea\' 。
如果在若干次旋转操作之后,A 能变成B,那么返回True。

示例

示例 1:
输入: A = \'abcde\', B = \'cdeab\'
输出: true

示例 2:
输入: A = \'abcde\', B = \'abced\'
输出: false

解题

class Solution:
    def rotateString(self, s: str, goal: str) -> bool:
        return len(s) == len(goal) and goal in s + s

由于s + s包含了所有可以通过旋转操作从 s 得到的字符串,
因此我们只需要判断goal是否为s + s的子串即可。

二、数组中出现次数超过一半的数字

题目描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例

示例 1:

输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2

解题

from collections import Counter

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        n = len(nums)
        for k, v in dict(Counter(nums)).items():
            if v >= n / 2:
                return k

涉及到出现次数的,我优先还是使用了Counter。

  • Counter(nums),然后转为dict,方便k,v遍历。
  • 知道了数组长度n,遍历数组时候,判断出现次数v是否>= n / 2即可。

如果不用Counter的话,也可以自己建一个字典,遍历下数组,把各数出现的次数统计到字典里去,剩下
的就跟上面一样了。

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        n = len(nums)
        hash_table = dict()
        for i in nums:
            if i in hash_table:
                hash_table[i] = hash_table[i] + 1
            else:
                hash_table[i] = 1
        for k, v in hash_table.items():
            if v >= n / 2:
                return k

三、反转字符串

题目描述

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例

输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]

解题

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

使用双指针,思路:

  • 指针right和指针left分别在输入数组s的两头。
  • right < left,就互相进行交互。然后右指针向左移动 +1,左指针向右移动 -1
  • right >= left,说明交换完毕。这里大于等于是考虑 数组长度为 偶数和奇数的情况。

四、回文链表

题目描述

请判断一个链表是否为回文链表。

示例

示例 1:

输入: 1->2
输出: false
示例 2:

输入: 1->2->2->1
输出: true

解题

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def isPalindrome(self, head: ListNode) -> bool:
        temp_list = []
        cur = head
        while cur:
            temp_list.append(cur.val)
            cur = cur.next
        return temp_list == temp_list[::-1]

回文链表是啥?就是链表反顺序过来还和之前的一样。那么,如果把链表中的元素都放到数组里,如果这个数组和反序的数组一样,
就说明了这个是回文链表了。

  • 声明一个数组temp_list
  • 声明一个辅助指针cur,指向head
  • 遍历链表,把每个元素的值添加到数组中,temp_list.append(cur.val)
  • 然后指针继续向后移动,cur = cur.next
  • 最后比较数组与反序数组是否相等。

五、回文数

题目描述

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

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

示例

示例 1:

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

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

解题

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

跟上面回文链表解法一致,注意下负数直接返回Fasle。

  • 将int转为字符串
  • 比较字符串和反序字符串是否一致。

以上是关于刷题LeetCode刷刷刷 — 2021-06-01的主要内容,如果未能解决你的问题,请参考以下文章

刷题LeetCode刷刷刷 — 2021-06-01

刷题LeetCode刷刷刷 — 2021-05-30

每日刷题191117

每日刷题191124

每日刷题1118

每日刷题191122