目录
前言:
1.相对名次
2.学生出勤记录 I
3.重塑矩阵
4.分糖果
5.最长和谐子序列
6.种花问题
前言:
今天我就分享一下最近在leetcode刷到的题,希望对大家有所帮助。编程语言:Python3。好了废话不多讲了,请看题:
1.相对名次
给你一个长度为 n 的整数数组 score ,其中 score[i] 是第 i 位运动员在比赛中的得分。所有得分都 互不相同 。
运动员将根据得分 决定名次 ,其中名次第 1 的运动员得分最高,名次第 2 的运动员得分第 2 高,依此类推。运动员的名次决定了他们的获奖情况:
名次第 1 的运动员获金牌 "Gold Medal" 。
名次第 2 的运动员获银牌 "Silver Medal" 。
名次第 3 的运动员获铜牌 "Bronze Medal" 。
从名次第 4 到第 n 的运动员,只能获得他们的名次编号(即,名次第 x 的运动员获得编号 "x")。
使用长度为 n 的数组 answer 返回获奖,其中 answer[i] 是第 i 位运动员的获奖情况。
class Solution:def findRelativeRanks(self, score):li=["Gold Medal","Silver Medal","Bronze Medal"]for i in range(3,len(score)):li.append(str(i+1))l=[]ss=[]for i in score:ss.append(i)i=0di={}for i in range(len(score)):di[max(score)]=li[i]score.remove(max(score))for j in ss:l.append(di[j])return l
方法思路:先创建一个储存名次的列表来li,然后向里面依次存入当前已有人数的名次(前三名跟后面的分开处理),然后我们创建一个字典,对当前score分数进行循环,把最大分数值作为字典的键,然后以li中的名次作为值(每次循环一次后,li的值往后移动一位),然后就把当前score中的最大值给移除掉就行了。最后用列表l 来储存字典中的名次,依次输出就行了
2.学生出勤记录 I
给你一个字符串 s 表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符:
'A':Absent,缺勤
'L':Late,迟到
'P':Present,到场
如果学生能够 同时 满足下面两个条件,则可以获得出勤奖励:按 总出勤 计,学生缺勤('A')严格 少于两天。
学生 不会 存在 连续 3 天或 连续 3 天以上的迟到('L')记录。
如果学生可以获得出勤奖励,返回 true ;否则,返回 false 。
class Solution:def checkRecord(self, s):return s.count('A')<2 and 'LLL' not in s
思路方法:可能刚刚开始会有人想复杂了,其实这道题非常简单,一行就可以搞定了,我就不讲了,看代码就懂了。
3.重塑矩阵
在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。
给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。
重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。
如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。
class Solution:def matrixReshape(self, mat, r, c) :li=[]for i in mat:li.extend(i)n=len(li)if c*r>n or c*r<n:return matnewmat=[]for _ in range(r):a=[]for _ in range(c):a.append(li.pop(0))newmat.append(a)return newmat
思路方法:先把这个矩阵里面的数字依次存入到列表li 里,下面就是通过对range(r) 和range(c) 的嵌套循环取出li 里面的数据了(这里是直接去利用队列的出队方法取出数据)
4.分糖果
Alice 有 n 枚糖,其中第 i 枚糖的类型为 candyType[i] 。Alice 注意到她的体重正在增长,所以前去拜访了一位医生。
医生建议 Alice 要少摄入糖分,只吃掉她所有糖的 n / 2 即可(n 是一个偶数)。Alice 非常喜欢这些糖,她想要在遵循医生建议的情况下,尽可能吃到最多不同种类的糖。
给你一个长度为 n 的整数数组 candyType ,返回: Alice 在仅吃掉 n / 2 枚糖的情况下,可以吃到糖的 最多 种类数。
class Solution:def distributeCandies(self, candyType) :a=set(candyType)ty=len(a)n=int(len(candyType)/2)if n>=ty:return tyreturn n
思路方法:首先通过集合的方法去重,获取到糖果的种类,然后对当前糖果的数量整除于2,得出的结果就是可以吃到的糖果,然后跟糖果种类数目进行比较,如果大于种类数目就说明可以吃到全部种类数目,反之就返回当前可以吃到的数量(即可以吃到的最多种类数目)
5.最长和谐子序列
和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。
现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。
数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
class Solution(object):def findLHS(self, nums):di={}li=[]for i in nums:di[i]=di.get(i,0)+1for i in di:if i+1 in di:li.append(di[i]+di[i+1])if li==[]:return 0return max(li)
思路方法:先是创建一个字典,作为元素数量的统计,然后对序列进行循环统计里面元素的个数存入到字典当中。再然后就是对字典进行循环,获取到字典相差为1的元素个数之和,然后存入到列表li当中,最后列表li里面的数字就是相差为1的元素数目之和,我们只需要返回最大值就行了。
6.种花问题
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false 。
class Solution:def canPlaceFlowers(self, flowerbed, n):count=0flowerbed.append(0)flowerbed.insert(0,0)for i in range(1,len(flowerbed)-1):if flowerbed[i]==flowerbed[i-1]==flowerbed[i+1]==0:flowerbed[i]=1count+=1return count>=n
思路方法:这道题做起来会比较无从下手,因为可能要考虑到这个数组最左边和最右边是否为1的问题,所以我们可以这样子,索性就在这个数组两边加上0,这样子我们就会发现这时候不需要去考虑两边的问题了,只要满足三个连续的0就可以实现种花。
好了,以上就是今天要分享的题目了,你们学会了吗?
分享一张壁纸: