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

简介: 【刷题】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转为字符串
  • 比较字符串和反序字符串是否一致。
相关文章
|
3天前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
9 0
|
3天前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
12 0
|
3天前
|
算法
【刷题】 leetcode 面试题 08.05.递归乘法
递归算法是一种在计算机科学和数学中广泛应用的解决问题的方法,其基本思想是利用问题的自我相似性,即将一个大问题分解为一个或多个相同或相似的小问题来解决。递归算法的核心在于函数(或过程)能够直接或间接地调用自身来求解问题的不同部分,直到达到基本情况(也称为基础案例或终止条件),这时可以直接得出答案而不必再进行递归调用。
25 4
【刷题】 leetcode 面试题 08.05.递归乘法
|
3天前
|
存储 算法 安全
【刷题】 leetcode 面试题 01.06 字符串压缩
来看效果: 非常好!!!过啦!!!
25 5
【刷题】 leetcode 面试题 01.06 字符串压缩
|
3天前
|
存储 算法 测试技术
|
3天前
|
算法 C语言 C++
|
3天前
|
存储 算法 C语言
C语言刷题~Leetcode与牛客网简单题
C语言刷题~Leetcode与牛客网简单题
|
3天前
刷题之Leetcode160题(超级详细)
刷题之Leetcode160题(超级详细)
13 0
|
3天前
|
Java
刷题之Leetcode19题(超级详细)
刷题之Leetcode19题(超级详细)
15 0