概述
从今天开始,有空就开始做题,主要不想让脑子太迟钝,先从简单的题目开始。
题1:重塑矩阵
题目描述
在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。
给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。
重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。
如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reshape-the-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
numpy中不是有reshape函数么,何不直接调用
提交代码
class Solution(object):
def matrixReshape(self, nums, r, c):
"""
:type nums: List[List[int]]
:type r: int
:type c: int
:rtype: List[List[int]]
"""
import numpy as np
nums_np = np.array(nums)
if r * c != nums_np.shape[0] * nums_np.shape[1]:
return nums
else:
return nums_np.reshape(r,c).tolist()
提交情况
题2:分糖果
题目描述
给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果。你需要把这些糖果平均分给一个弟弟和一个妹妹。返回妹妹可以获得的最大糖果的种类数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/distribute-candies
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
用set函数删除重复值,判断非重复集合长度与原列表长度一半的大小
提交代码
class Solution(object):
def distributeCandies(self, candies):
"""
:type candies: List[int]
:rtype: int
"""
hf = len(candies)/2
c = set(candies)
if len(c) > hf:
return hf
else:
return len(c)
提交情况
题3:检查单词是否为句中其他单词的前缀
题目描述
给你一个字符串 sentence 作为句子并指定检索词为 searchWord ,其中句子由若干用 单个空格 分隔的单词组成。
请你检查检索词 searchWord 是否为句子 sentence 中任意单词的前缀。
如果 searchWord 是某一个单词的前缀,则返回句子 sentence 中该单词所对应的下标(下标从 1 开始)。
如果 searchWord 是多个单词的前缀,则返回匹配的第一个单词的下标(最小下标)。
如果 searchWord 不是任何单词的前缀,则返回 -1 。
字符串 S 的 「前缀」是 S 的任何前导连续子字符串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/check-if-a-word-occurs-as-a-prefix-of-any-word-in-a-sentence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
split函数将字符串转为列表,然后在列表中遍历搜索判断是否存在searchWord
提交代码
class Solution(object):
def isPrefixOfWord(self, sentence, searchWord):
"""
:type sentence: str
:type searchWord: str
:rtype: int
"""
s = sentence.split(' ')
for i in range(len(s)):
if s[i][:len(searchWord)] == searchWord:
return i + 1
return -1
提交情况
题4:统计有序矩阵中的负数
题目描述
给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。
请你统计并返回 grid 中 负数 的数目。
解题思路
遍历就行了
提交代码
class Solution(object):
def countNegatives(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
s = 0
for i in grid:
for j in i:
if j < 0:
s += 1
return s
提交情况
思考
显然我提交的代码不是最优解,这么简单个题目时间复杂度居然是O(n^2),肯定不合适。当然博主本身没学过算法,只能看看那些大神都是怎么写的了。
下面是别人的解题思路:
充分利用非递增条件,遇到小于0的数便停止循环,直接加上(n-j)*(m-i)的数。
class Solution:
def countNegatives(self, grid: List[List[int]]) -> int:
res = 0
m = len(grid)
n = len(grid[0])
for i in range(m):
for j in range(n):
if grid[i][j] < 0:
res += (n-j)*(m-i)
n = j
break
return res
感觉也没啥优化,就是利用了一个非递增条件,时间复杂度和我的一样。
题5 根据数字二进制下 1 的数目排序
题目描述
给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。
请你返回排序后的数组。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
- 首先十进制数组要转成二进制,bin(arr)可以实现;
- 根据二进制数据中数字1的个数排序,count函数可以统计字符串、数字中某个数出现的次数;
- 排序用sorted函数,引入匿名函数,用参数key来设定排序规则。
提交代码
class Solution(object):
def sortByBits(self, arr):
"""
:type arr: List[int]
:rtype: List[int]
"""
return sorted(arr, key=lambda x: (bin(x).count('1'), x))
提交情况
题6:有多少小于当前数字的数字
题目描述
给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。
换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 nums[j] < nums[i] 。
以数组形式返回答案。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/how-many-numbers-are-smaller-than-the-current-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
肯定要排序,那少不了sort函数,然后可以用index函数来索引排序列表的位置。
提交代码
class Solution:
def smallerNumbersThanCurrent(self, nums: List[int]) -> List[int]:
numsNew = nums.copy()
numsNew.sort()
return [numsNew.index(i) for i in nums]
提交情况
题7:生成每种字符都是奇数个的字符串
题目描述
给你一个整数 n,请你返回一个含 n 个字符的字符串,其中每种字符在该字符串中都恰好出现 奇数次 。
返回的字符串必须只含小写英文字母。如果存在多个满足题目要求的字符串,则返回其中任意一个即可。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-a-string-with-characters-that-have-odd-counts
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
刷到这题,让我觉得我的智商受到了侮辱
提交代码
class Solution:
def generateTheString(self, n: int) -> str:
if n % 2 == 1:
return 'a'*n
else:
return 'a'*(n-1)+'b'
提交情况
我甚至不想描述
题8:矩阵中的幸运数
题目描述
给你一个 m * n 的矩阵,矩阵中的数字 各不相同 。请你按 任意 顺序返回矩阵中的所有幸运数。
幸运数是指矩阵中满足同时下列两个条件的元素:
在同一行的所有元素中最小
在同一列的所有元素中最大
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lucky-numbers-in-a-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
这题乍一看,感觉又在侮辱我智商,仔细一想,好像不是那么回事儿,感觉不好写,看看我的暴力解法(也叫憨憨解法,O(∩_∩)O哈哈~)
提交代码
class Solution:
def luckyNumbers (self, matrix: List[List[int]]) -> List[int]:
import numpy as np
matrix_np = np.array(matrix)
mi = []
for i in range(len(matrix)):
mi.append([min(matrix[i][:]), matrix[i][:].index(min(matrix[i][:]))])
ma = []
for j in mi:
if j[0] == max(matrix_np[:, j[1]]):
ma.append(j[0])
return ma
提交情况
我都有点不好意思贴上来。。。
简直战五渣。。
思考
这么写肯定不是一个程序员或者搞算法的人应该写出来的程序,虽然我只是个编程爱好者,但也不能接受。有没有啥更好的思路,动态规划?分治算法?
看了看官方的解释,原来还可以这么写。。
class Solution:
def luckyNumbers(self, matrix: List[List[int]]) -> List[int]:
mins = {min(rows) for rows in matrix}
maxes = {max(columns) for columns in zip(*matrix)}
return list(mins & maxes)
主要还是Python基础不牢固,很多函数还不熟练。
今天就到这里吧。
最后
以上就是难过美女为你收集整理的LeetCode题解(2020-10-23)题1:重塑矩阵题2:分糖果题3:检查单词是否为句中其他单词的前缀题4:统计有序矩阵中的负数题5 根据数字二进制下 1 的数目排序题6:有多少小于当前数字的数字题7:生成每种字符都是奇数个的字符串题8:矩阵中的幸运数的全部内容,希望文章能够帮你解决LeetCode题解(2020-10-23)题1:重塑矩阵题2:分糖果题3:检查单词是否为句中其他单词的前缀题4:统计有序矩阵中的负数题5 根据数字二进制下 1 的数目排序题6:有多少小于当前数字的数字题7:生成每种字符都是奇数个的字符串题8:矩阵中的幸运数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复