class Solution():
'''
————————————第一题——————————————
输入:有重复值的nums
求:数组中某个num邻居数量的最大值 (k的邻居数为k-1,k,k+1)
以[6,2,2,1,5,3,3]为例, 2的邻居数为5,分别是1,2,2,3,3
'''
def meituan1(self,nums):
dict_a={}
res=0
for num in nums:
if num not in dict_a:
dict_a[num]=1
else:
dict_a[num]+=1
if num+1 not in dict_a:
dict_a[num+1]=1
else:
dict_a[num+1]+=1
if num-1 not in dict_a:
dict_a[num-1]=1
else:
dict_a[num-1]+=1
return max(list(dict_a.values()))
'''
————————————第二题——————————————
输入 m*n的grid,x表示路障,o表示无路障,可以向右下两个方向前进
[['x','o','x','x'],
['o','o','x','o'],
['x','x','o','o'],
['x','x','x','x']]
求从00到mn上所有路径中路障最少的路径的路障数量
'''
def meituan2(self,nums):
m,n=len(nums),len(nums[0])
dp=[[0 for _ in range(n)] for _ in range(m)]
dp[0][0] =0 if nums[0][0]=='o' else 1
for i in range(1,m):
dp[i][0] = dp[i-1][0]+(0 if nums[i][0]=='o' else 1)
for j in range(1,n):
dp[0][j] = dp[0][j-1]+(0 if nums[0][j]=='o' else 1)
for i in range(1,m):
for j in range(1,n):
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+(0 if nums[i][j]=='o' else 1)
# for i in range(m):
# print(dp[i])
return dp[m-1][n-1]
'''
————————————第三题——————————————
最大连续相同字符:
输入第一行 n k
输入第二行 ++---++--++++++
有一个仅包含’+’和’-’两种字符的字符串s,长度为n,每次操作可以把一个字符做一次转换(把一个’-’设置为’+’,或者把一个’+’置成’-’);
但是操作的次数有上限k,问在有限的操作数范围内,能够得到最大连续的相同字符的子串的长度是多少。
'''
def meituan3(self,str,k):
n=len(str)
def get_max_len(str,aim): #将aim字符进行转换
record=[]
for i in range(n):
if str[i]==aim:
record.append(i)
record.append(n)
max_l=0
if k>len(record):return n #在k的范围内能够实现完全转换
else:
max_l=record[k] #在k范围内能够转换的长度
for i in range(k+1,len(record)):
max_l=max(max_l,record[i]-record[i-k-1]-1)#已知的k个替换后的最大总长度 和 现在新的连续每个替换后的总长度 中最长的
return max_l
return max(get_max_len(str, '+'), get_max_len(str, '-'))
'''
————————————第四题——————————————
第一行输入为:品牌数量 操所数量 2 6 (俩个品牌,六个操作)
第二行输入为:各品牌单价 1 2 (品牌一单价:1,品牌二单价:2)
后面各行为输入操作,如:
Add 1 2 为:品牌1 的销量是2
Query BestSales 为:求到目前为止销量最高的品牌
Query BestProfit 为:求到目前为止利润最高的品牌
'''
def meituan4(self):
kind=2
price=[1,2]
price_count=[0]*kind
sales_count=[0]*kind
op=["Add 1 3","Add 2 2","Query BestSales","Query BestProfit","Add 2 2","Query BestProfit"]
k=len(op)
i=0
while k: #有操作就执行
a=op[i].split()
operate=a[0]
if operate=="Add":
kind_a=int(a[1])-1
num=int(a[2])
price_count[kind_a]+=(num*price[kind_a])
sales_count[kind_a]+=(num)
elif operate=="Query":
operate_a=a[1]
if operate_a=="BestProfit":
max_kind=max(price_count)
print(price_count.index(max_kind)+1)
if operate_a=="BestSales":
max_kind=max(sales_count)
print(sales_count.index(max_kind)+1)
k-=1
i+=1
if __name__=="__main__":
s=Solution()
print("___________第一题___________")
nums1=[6,2,2,1,5,3,3]
res1=s.meituan1(nums1)
print(res1)
print("___________第二题___________")
nums2=[['x','o','x','x'],
['o','o','x','o'],
['x','x','o','o'],
['x','x','x','x']]
res2=s.meituan2(nums2)
print(res2)
print("___________第三题___________")
str="++---++--++++++"
res3=s.meituan3(str,2)
print(res3)
print("___________第四题___________")
s.meituan4()
其中第三题参考:最大连续相同的字符。