LeetCode 周赛 254

8/16/2021 LeetCode

# 第一题 - 作为子字符串出现在单词中的字符串数目

简单

原题链接:https://leetcode-cn.com/problems/number-of-strings-that-appear-as-substrings-in-word (opens new window)

# 题目描述

给你一个字符串数组 patterns 和一个字符串 word ,统计 patterns 中有多少个字符串是 word 的子字符串。返回字符串数目。

子字符串 是字符串中的一个连续字符序列。

示例 1

输入:patterns = ["a","abc","bc","d"], word = "abc"
输出:3
解释:

  • "a" 是 "abc" 的子字符串。
  • "abc" 是 "abc" 的子字符串。
  • "bc" 是 "abc" 的子字符串。
  • "d" 不是 "abc" 的子字符串。
    patterns 中有 3 个字符串作为子字符串出现在 word 中。
示例 2

输入:patterns = ["a","b","c"], word = "aaaaabbbbb"
输出:2
解释:

  • "a" 是 "aaaaabbbbb" 的子字符串。
  • "b" 是 "aaaaabbbbb" 的子字符串。
  • "c" 不是 "aaaaabbbbb" 的字符串。 patterns 中有 2 个字符串作为子字符串出现在 word 中。
示例 3

输入:patterns = ["a","a","a"], word = "ab"
输出:3
解释:patterns 中的每个字符串都作为子字符串出现在 word "ab" 中。

提示

1 <= patterns.length <= 100
1 <= patterns[i].length <= 100
1 <= word.length <= 100
patterns[i] 和 word 由小写英文字母组成

# Python题解

class Solution(object):
    def numOfStrings(self, patterns, word):
        """
        :type patterns: List[str]
        :type word: str
        :rtype: int
        """
        ans = 0
        for pattern in patterns:
            if pattern in word:
                ans += 1

        return ans
1
2
3
4
5
6
7
8
9
10
11
12
13

# 总结

in 关键字实属开挂行为,高阶做法参考官解。

# 第二题 - 构造元素不等于两相邻元素平均值的数组

中等

原题链接:https://leetcode-cn.com/problems/array-with-elements-not-equal-to-average-of-neighbors (opens new window)

# 题目描述

给你一个 下标从 0 开始 的数组 nums ,数组由若干 互不相同的 整数组成。你打算重新排列数组中的元素以满足:重排后,数组中的每个元素都 不等于 其两侧相邻元素的 平均值 。

更公式化的说法是,重新排列的数组应当满足这一属性:对于范围 1 <= i < nums.length - 1 中的每个 i ,(nums[i-1] + nums[i+1]) / 2 不等于 nums[i] 均成立 。

返回满足题意的任一重排结果。

示例 1

输入:nums = [1,2,3,4,5]
输出:[1,2,4,5,3]
解释:
i=1, nums[i] = 2, 两相邻元素平均值为 (1+4) / 2 = 2.5
i=2, nums[i] = 4, 两相邻元素平均值为 (2+5) / 2 = 3.5
i=3, nums[i] = 5, 两相邻元素平均值为 (4+3) / 2 = 3.5

示例 2

输入:nums = [6,2,0,9,7]
输出:[9,7,6,2,0]
解释:
i=1, nums[i] = 7, 两相邻元素平均值为 (9+6) / 2 = 7.5
i=2, nums[i] = 6, 两相邻元素平均值为 (7+2) / 2 = 4.5
i=3, nums[i] = 2, 两相邻元素平均值为 (6+0) / 2 = 3

提示

3 <= nums.length <= 105
0 <= nums[i] <= 105

# Python题解

class Solution(object):
    def rearrangeArray(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        for i in range(1, len(nums) - 1):
            if nums[i] == (nums[i + 1] + nums[i - 1]) / 2:
                tmp = nums[i]
                nums[i] = nums[-1]
                nums[-1] = tmp
        return nums
1
2
3
4
5
6
7
8
9
10
11
12

# 总结

没看官解,过了就行

# 第三题 - 数组元素的最小非零乘积

中等

原题链接:https://leetcode-cn.com/problems/minimum-non-zero-product-of-the-array-elements (opens new window)

# 题目描述

给你一个正整数 p 。你有一个下标从 1 开始的数组 nums ,这个数组包含范围 [1, 2p - 1] 内所有整数的二进制形式(两端都 包含)。你可以进行以下操作 任意 次:

从 nums 中选择两个元素 x 和 y  。 选择 x 中的一位与 y 对应位置的位交换。对应位置指的是两个整数 相同位置 的二进制位。 比方说,如果 x = 1101 且 y = 0011 ,交换右边数起第 2 位后,我们得到 x = 1111 和 y = 0001 。

请你算出进行以上操作 任意次 以后,nums 能得到的 最小非零 乘积。将乘积对 109 + 7 取余 后返回。

注意:答案应为取余 之前 的最小值。

示例 1

输入:p = 1
输出:1
解释:nums = [1] 。
只有一个元素,所以乘积为该元素。

示例 2

输入:p = 2
输出:6
解释:nums = [01, 10, 11] 。
所有交换要么使乘积变为 0 ,要么乘积与初始乘积相同。
所以,数组乘积 1 * 2 * 3 = 6 已经是最小值。

示例 3

输入:p = 3
输出:1512
解释:nums = [001, 010, 011, 100, 101, 110, 111]

  • 第一次操作中,我们交换第二个和第五个元素最左边的数位。
    • 结果数组为 [001, 110, 011, 100, 001, 110, 111] 。
  • 第二次操作中,我们交换第三个和第四个元素中间的数位。
    • 结果数组为 [001, 110, 001, 110, 001, 110, 111] 。
      数组乘积 1 * 6 * 1 * 6 * 1 * 6 * 7 = 1512 是最小乘积。
提示

1 <= p <= 60

# Python题解

没写出来,todo...

# 总结

todo...

# 第四题 - 你能穿过矩阵的最后一天

困难

原题链接:https://leetcode-cn.com/problems/last-day-where-you-can-still-cross/ (opens new window)

题都没看 遇到困难 睡大觉 - -