# -*- coding: utf-8 -*-
# 151: 搜索二维矩阵 II
# 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
# 每行的元素从左到右升序排列。
# 每列的元素从上到下升序排列。
# 示例 1:
# 输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
# 输出:true
#
# 示例 2:
# 输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
# 输出:false
class Solution151:
def searchMatrix(self, matrix, target: int) -> bool:
result = None
for i in matrix:
if target in i:
return True
else:
result = False
return result
s151 = Solution151()
data151 = [[1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]
r151 = s151.searchMatrix(data151, 1)
print(r151)
# 152: 搜索旋转排序数组 II
# 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,
# 使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。
# 例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4] 。
# 给你 旋转后 的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。
# 如果 nums 中存在这个目标值 target ,则返回 true ,否则返回 false 。
# 你必须尽可能减少整个操作步骤。
# 示例 1:
# 输入:nums = [2,5,6,0,0,1,2], target = 0
# 输出:true
#
# 示例 2:
# 输入:nums = [2,5,6,0,0,1,2], target = 3
# 输出:false
class Solution152:
def search(self, nums, target: int) -> bool:
return target in nums
s152 = Solution152()
r152 = s152.search([3, 1, 4, 4, 1, 3], 8)
print(r152) # False
# 153: 剑指 Offer II 060. 出现频率最高的 k 个数字
# 给定一个整数数组 nums 和一个整数 k ,请返回其中出现频率前 k 高的元素。可以按 任意顺序 返回答案。
# 示例 1:
# 输入: nums = [1,1,1,2,2,3], k = 2
# 输出: [1,2]
# 示例 2:
# 输入: nums = [1], k = 1
# 输出: [1]
class Solution153:
def topKFrequent(self, nums, k):
# 先转成kv字典。数值对次数。
# 取出次数列表,排序
# 列表 k的 逆取,即为次数。
# 遍历字典,如果v == 次数。
# 塞入结果。
import collections
m = collections.Counter(nums)
list1 = list(m.values())
list1.sort()
count = list1[-k]
result = []
for k, v in m.items():
if v >= count:
result.append(k)
return result
s153 = Solution153()
r153 = s153.topKFrequent([3, 1, 4, 4, 1, 3, 2, 4], 1)
print(r153) # [4]
# 154: 根据字符出现频率排序
# 给定一个字符串 s ,根据字符出现的 频率 对其进行 降序排序 。一个字符出现的 频率 是它出现在字符串中的次数。
# 返回 已排序的字符串 。如果有多个答案,返回其中任何一个。
# 示例 1:
# 输入: s = "tree"
# 输出: "eert"
# 解释: 'e'出现两次,'r'和't'都只出现一次。
# 因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。
# 示例 2:
# 输入: s = "cccaaa"
# 输出: "cccaaa"
# 解释: 'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。
# 注意"cacaca"是不正确的,因为相同的字母必须放在一起。
# 示例 3:
# 输入: s = "Aabb"
# 输出: "bbAa"
# 解释: 此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。
# 注意'A'和'a'被认为是两种不同的字符。
class Solution154:
def topKFrequent(self, nums, k):
# 先转成kv字典。数值对次数。
# 取出次数列表,排序
# 列表 k 的 逆取,即为次数。
# 遍历字典,如果v == 次数。
# 塞入结果。
import collections
m = collections.Counter(nums)
list1 = list(m.values())
list1.sort()
count = list1[-k]
result = []
for k, v in m.items():
if v >= count:
result.append(k)
return result
s154 = Solution154()
r154 = s154.topKFrequent([3, 1, 4, 4, 1, 3, 2, 4], 1)
print(r154) # [4]
# 155: 剑指 Offer II 070. 排序数组中只出现一次的数字
# 给定一个只包含整数的有序数组 nums ,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。
# 示例 1:
# 输入: nums = [1,1,2,3,3,4,4,8,8]
# 输出: 2
# 示例 2:
# 输入: nums = [3,3,7,7,10,11,11]
# 输出: 10
class Solution155:
def singleNonDuplicate(self, nums) -> int:
# method One
# return sum(set(nums)) * 2 - sum(nums)
# method Two
import collections
result = collections.Counter(nums).most_common()
return result[-1][0]
s155 = Solution155()
r155 = s155.singleNonDuplicate([3, 1, 4, 1, 3, 2, 4])
print(r155) # 2
# 156: 执行操作后的变量值
# 给定一个只包含整数的有序数组 nums ,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。
# 示例 1:
# 输入: nums = [1,1,2,3,3,4,4,8,8]
# 输出: 2
# 示例 2:
# 输入: nums = [3,3,7,7,10,11,11]
# 输出: 10
class Solution156:
def finalValueAfterOperations(self, operations) -> int:
init_number = 0
for i in operations:
if i in ["++X", "X++"]:
init_number += 1
else:
init_number -= 1
return init_number
s156 = Solution156()
r156 = s156.finalValueAfterOperations(["++X", "++X", "X++"])
print(r156) # 3
# 157: 剑指 Offer 58 - II. 左旋转字符串
# 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。
# 比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
# 示例 1:
# 输入: s = "abcdefg", k = 2
# 输出: "cdefgab"
# 示例 2:
# 输入: s = "lrloseumgh", k = 6
# 输出: "umghlrlose"
class Solution157:
def reverseLeftWords(self, s: str, n: int) -> str:
result = s[n:] + s[:n]
return result
s157 = Solution157()
r157 = s157.reverseLeftWords("helloWorld", 3)
print(r157) # loWorldhel
# 158: 句子中的最多单词数
# 一个 句子 由一些 单词 以及它们之间的单个空格组成,句子的开头和结尾不会有多余空格。
# 给你一个字符串数组 sentences ,其中 sentences[i] 表示单个 句子 。
# 请你返回单个句子里 单词的最多数目 。
# 示例 1:
# 输入:sentences = ["alice and bob love leetcode", "i think so too", "this is great thanks very much"]
# 输出:6
# 解释:
# - 第一个句子 "alice and bob love leetcode" 总共有 5 个单词。
# - 第二个句子 "i think so too" 总共有 4 个单词。
# - 第三个句子 "this is great thanks very much" 总共有 6 个单词。
# 所以,单个句子中有最多单词数的是第三个句子,总共有 6 个单词。
# 示例 2:
# 输入:sentences = ["please wait", "continue to fight", "continue to win"]
# 输出:3
# 解释:可能有多个句子有相同单词数。
# 这个例子中,第二个句子和第三个句子(加粗斜体)有相同数目的单词数。
class Solution158:
def mostWordsFound(self, sentences) -> int:
return max([len(i.split()) for i in sentences])
s158 = Solution158()
r158 = s158.mostWordsFound(["hello python", "hi python"])
print(r158) # 2
# 159: 面试题 08.04. 幂集
# 幂集。编写一种方法,返回某集合的所有子集。集合中不包含重复的元素。
# 说明:解集不能包含重复的子集。
# 示例:
# 输入: nums = [1,2,3]
# 输出:
# [
# [3],
# [1],
# [2],
# [1,2,3],
# [1,3],
# [2,3],
# [1,2],
# []
# ]
class Solution159:
def subsets(self, nums):
import itertools
n = len(nums)
result = [[]]
for num in range(n):
for i in itertools.combinations(nums, num + 1):
result.append(list(i))
return result
s159 = Solution159()
r159 = s159.subsets([2, 3, 4])
print(r159) # [[], [2], [3], [4], [2, 3], [2, 4], [3, 4], [2, 3, 4]]
# 160: 检查两个字符串是否几乎相等
# 如果两个字符串 word1 和 word2 中从 'a' 到 'z' 每一个字母出现频率之差都 不超过 3 ,
# 那么我们称这两个字符串 word1 和 word2 几乎相等 。
# 给你两个长度都为 n 的字符串 word1 和 word2 ,如果 word1 和 word2 几乎相等 ,
# 请你返回 true ,否则返回 false 。
# 一个字母 x 的出现 频率 指的是它在字符串中出现的次数。
# 示例 1:
# 输入:word1 = "aaaa", word2 = "bccb"
# 输出:false
# 解释:字符串 "aaaa" 中有 4 个 'a' ,但是 "bccb" 中有 0 个 'a' 。
# 两者之差为 4 ,大于上限 3 。
# 示例 2:
# 输入:word1 = "abcdeef", word2 = "abaaacc"
# 输出:true
# 解释:word1 和 word2 中每个字母出现频率之差至多为 3 :
# - 'a' 在 word1 中出现了 1 次,在 word2 中出现了 4 次,差为 3 。
# - 'b' 在 word1 中出现了 1 次,在 word2 中出现了 1 次,差为 0 。
# - 'c' 在 word1 中出现了 1 次,在 word2 中出现了 2 次,差为 1 。
# - 'd' 在 word1 中出现了 1 次,在 word2 中出现了 0 次,差为 1 。
# - 'e' 在 word1 中出现了 2 次,在 word2 中出现了 0 次,差为 2 。
# - 'f' 在 word1 中出现了 1 次,在 word2 中出现了 0 次,差为 1 。
# 示例 3:
# 输入:word1 = "cccddabba", word2 = "babababab"
# 输出:true
# 解释:word1 和 word2 中每个字母出现频率之差至多为 3 :
# - 'a' 在 word1 中出现了 2 次,在 word2 中出现了 4 次,差为 2 。
# - 'b' 在 word1 中出现了 2 次,在 word2 中出现了 5 次,差为 3 。
# - 'c' 在 word1 中出现了 3 次,在 word2 中出现了 0 次,差为 3 。
# - 'd' 在 word1 中出现了 2 次,在 word2 中出现了 0 次,差为 2 。
class Solution160:
def checkAlmostEquivalent(self, word1: str, word2: str) -> bool:
# 转元素个数统计。
# 遍历两个结果。两个的绝对值都小于3则几乎相等。反正大于4则退出并且False
from collections import Counter
count1 = dict(Counter(word1))
count2 = dict(Counter(word2))
result1 = True
result2 = True
for k, v in count1.items():
if k in count2:
temp = abs(count2[k] - v)
if temp > 3:
result1 = False
break
else:
temp = abs(0 - v)
if temp > 3:
result1 = False
break
for k, v in count2.items():
if k in count1:
temp = abs(count1[k] - v)
if temp > 3:
result2 = False
break
else:
temp = abs(0 - v)
if temp > 3:
result1 = False
break
return True if (result1 == True and result2 == True) else False
s160 = Solution160()
r160 = s160.checkAlmostEquivalent("hello python", "hi pyhton")
print(r160) # True
微信公众号:玩转测试开发
欢迎关注,共同进步,谢谢!