当前位置:   article > 正文

LeetCode第 47 场双周赛(前3道题——python)_判断一个数字是否可以表示为7的幂的和

判断一个数字是否可以表示为7的幂的和

相关链接可点击:

5680. 找到最近的有相同 X 或 Y 坐标的点

5681. 判断一个数字是否可以表示成三的幂的和

1781. 所有子字符串美丽值之和


目录

5680_找到最近的有相同X或Y坐标的点

一、题目

二、示例

三、思路

四、代码

5681_判断一个数字是否可以成三的幂的和

一、题目

二、示例

三、思路

四、代码

1781_所有子字符串美丽值之和

一、题目

二、示例

三、思路

四、代码


5680_找到最近的有相同X或Y坐标的点

一、题目

给你两个整数 x 和 y ,表示你在一个笛卡尔坐标系下的 (x, y) 处。同时,在同一个坐标系下给你一个数组 points ,其中 points[i] = [ai, bi] 表示在 (ai, bi) 处有一个点。当一个点与你所在的位置有相同的 x 坐标或者相同的 y 坐标时,我们称这个点是 有效的 

请返回距离你当前位置 曼哈顿距离 最近的 有效 点的下标(下标从 0 开始)如果有多个最近的有效点,请返回下标 最小 的一个。如果没有有效点,请返回 -1 。

两个点 (x1, y1) 和 (x2, y2) 之间的 曼哈顿距离 为 abs(x1 - x2) + abs(y1 - y2) 。

二、示例

示例 1:

输入:x = 3, y = 4, points = [[1,2],[3,1],[2,4],[2,3],[4,4]]
输出:2
解释:所有点中,[3,1],[2,4] 和 [4,4] 是有效点。有效点中,[2,4] 和 [4,4] 距离你当前位置的曼哈顿距离最小,都为 1 。[2,4] 的下标最小,所以返回 2 。

示例 2:

输入:x = 3, y = 4, points = [[3,4]]
输出:0
提示:答案可以与你当前所在位置坐标相同。

示例 3:

输入:x = 3, y = 4, points = [[2,3]]
输出:-1
解释:没有有效点。

提示:

  • 1 <= points.length <= 10^4
  • points[i].length == 2
  • 1 <= x, y, ai, bi <= 10^4

三、思路

题意:

有效点:一个点与你所在的位置有相同的 x 坐标或者相同的 y 坐标时,我们称这个点是 有效的 ;

曼哈顿距离:两个点 (x1, y1) 和 (x2, y2) 之间的 曼哈顿距离 为 abs(x1 - x2) + abs(y1 - y2)

返回:最近的 有效 点的下标(下标从 0 开始),如果有多个最近的有效点,请返回下标 最小 的一个。否则,返回 -1.

因此,思路为:

  1. 求出有效点
  2. 求出每个有效点与当前位置(即题目中所给出的(x, y)的曼哈顿距离
  3. 返回曼哈顿距离最小的点的下标 

四、代码

  1. class Solution:
  2. def nearestValidPoint(self, x: int, y: int, points) -> int:
  3. import sys
  4. """
  5. :param x: int
  6. :param y: int
  7. :param points: List[List[int]]
  8. :return: int
  9. """
  10. min_dist = sys.maxsize # 最小曼哈顿距离
  11. ans = sys.maxsize
  12. for index in range(len(points)):
  13. if points[index][0] == x or points[index][1] == y:
  14. dist = abs(points[index][1] - y) + abs(points[index][0] - x)
  15. if dist < min_dist:
  16. min_dist = dist
  17. ans = index
  18. return -1 if ans == sys.maxsize else ans
  19. if __name__ == '__main__':
  20. x = 3
  21. y = 4
  22. points = [[1, 2], [3, 1], [2, 4], [2, 3], [4, 4]]
  23. # x = 3
  24. # y = 4
  25. # points = [[2, 3]]
  26. # x = 5
  27. # y = 1
  28. # points = [[1, 1], [6, 2], [1, 5], [3, 1]]
  29. s = Solution()
  30. ans = s.nearestValidPoint(x, y, points)
  31. print(ans)

5681_判断一个数字是否可以成三的幂的和

一、题目

给你一个整数 n ,如果你可以将 n 表示成若干个不同的三的幂之和,请你返回 true ,否则请返回 false 。

对于一个整数 y ,如果存在整数 x 满足 y==3^{x} ,我们称这个整数 y 是三的幂

二、示例

示例 1:

输入:n = 12
输出:true
解释:12=3^{1} + 3^{2}

示例 2:

输入:n = 91
输出:true
解释:91=3^{0}+3^{2}+3^{4}

示例 3:

输入:n = 21
输出:false

提示:

  • 1\leq n\leq 10^{7}

三、思路

题意:

对于一个整数 n,如果其可以由 多项式 y=a_{0}3^{0}+a_{1}3^{1}+a_{2}3^{2}+...+a_{n}3^{n},其中,a_{0},a_{1},a_{2},...,a_{n}为0或1为 0 或 1。

若满足,则返回 True, 否则,返回 False。

思路:

因为题中给出 1\leq n\leq 10^{7},因此 指数幂 最大不超过14。

因此,数组 martix 长度为15,初始化为:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],下标表示指数幂。

例如:整数12

12=3^{1} + 3^{2}

因此令 martix[1] = 1, martix[2] = 1,即转换成三进制。

若转换后的数组 martix 中的数字只有0 和 1,返回True,否则,返回 False.

四、代码

  1. import math
  2. class Solution:
  3. def checkPowersOfThree1(self, n: int) -> bool:
  4. martix = [0 for _ in range(15)]
  5. while n != 0:
  6. x = int(math.log(n, 3)) # 指数
  7. martix[x] += 1
  8. n -= pow(3, x)
  9. return max(martix) <= 1
  10. if __name__ == '__main__':
  11. # n = 12
  12. # n = 91
  13. n = 21
  14. s = Solution()
  15. ans = s.checkPowersOfThree(n)
  16. print(ans)

1781_所有子字符串美丽值之和

一、题目

一个字符串的 美丽值 定义为:出现频率最高字符与出现频率最低字符的出现次数之差。

比方说,"abaacc" 美丽值为 3 - 1 = 2 。
给你一个字符串 s ,请你返回它所有子字符串的 美丽值 之和。

二、示例

示例 1:

输入:s = "aabcb"
输出:5
解释:美丽值不为零的字符串包括 ["aab","aabc","aabcb","abcb","bcb"] ,每一个字符串的美丽值都为 1 。

示例 2:

输入:s = "aabcbaa"
输出:17

提示:

  • 1 <= s.length <= 500
  • s 只包含小写英文字母。

三、思路

题意:

美丽值:出现频率最高字符与出现频率最低字符的出现次数之差。

返回:该字符串中的所有子字符串美丽值之和

思路:

  1. 求出当前字符串的所有子字符串
  2. 求出每个子字符串的美丽值
  3. 返回所有美丽值之和

在这里运用了一个小技巧,如果单纯的暴力的去求每个子字符串的美丽值很容易超时。

例如:字符串 “aabcb” 

每一次只需在上一次的基础上添加新的字符即可。

 

四、代码

  1. class Solution:
  2. # 返回每个子字符串的美丽值
  3. def single_beauty_num(self, left, right):
  4. if left != right:
  5. if self.s[right] not in self.martix:
  6. self.martix[self.s[right]] = 1
  7. else:
  8. self.martix[self.s[right]] += 1
  9. self.maxnum = max(self.martix.values())
  10. self.minnum = min(self.martix.values())
  11. # print(self.maxnum, self.minnum)
  12. return self.maxnum - self.minnum
  13. def beautySum(self, s: str) -> int:
  14. ans = 0 # 美丽值总和
  15. self.s = s
  16. for i in range(len(self.s)):
  17. self.martix = dict() # dict记录子字符串各个字符出现的次数
  18. self.martix[self.s[i]] = 1
  19. for j in range(1, len(self.s) - i + 1):
  20. ans += self.single_beauty_num(i, i + j - 1)
  21. return ans
  22. if __name__ == '__main__':
  23. s = "aabcb"
  24. obj = Solution()
  25. ans = obj.beautySum(s)
  26. print(ans)

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/856014
推荐阅读
相关标签
  

闽ICP备14008679号