对撞指针例题+字典妙用

11. 盛最多水的容器

https://leetcode.cn/problems/container-with-most-water/

题目:

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

 审题:

        1.第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 

        2.找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水

        3.你不能倾斜容器:左右两根线以最短的那一根为基准线

思路概述:

首先呢一遇到数组求区域最大值,一般首先想到双指针来做。

定义一个左右指针。假定初始Max_area就是左右指针的面积。然后左右指针分别移动(移动矮的这一个,如果相同的话移动任意一个)。然后重新计算area的值并与上一次的进行比较更新。

 代码:

def Maxarea(height):
    ans=0   # 后续方便与area进行更新比较
    left=0  # 左指针
    right=len(height)-1 # 右指针
    while left<right:
        max_area=(right-left)*min(height[left],height[right]) # 计算第一次的area值
        ans=max(ans,max_area) # 比较更新
        if height[left]<height[right]:
            left+=1
        elif height[left]==height[right]: # 如果left与right高度相同,随便移动哪一个
            left+=1
        else:
            right-=1
    return ans

题目 2672: 

蓝桥杯2022年第十三届省赛真题-字符统计

https://www.dotcpp.com/oj/problem2672.html

题目:

审题:

        1.输出其中出现次数最多的字母

        2.如果有多个字母均出现了最多次,按字母表顺序依次输出所有这些字母(字母序)

思路:

        没思路,用暴力吧。最后写一半发现暴力好像也不知道怎么个暴力法儿

        就想着看看能不能有一种方法是这样的['字母','出现次数']。嗯哼这个好像有点熟悉这不就是字典么{'键':'值'}。试试?试试就试试

        查阅字典资料发现:字典.get('键',0)+1方法

    

# 假设d={'a':1,'b':2}
d[c]=d.get(i,0)+1
本来c这个键是不在字典d中的,但是通过get方法可以将c添加到字典d中并把它的值赋为1
# d[a]=d.get(i,0)+1
如果a这个键是存在与字典d中的,通过此方法可以把它的值加一
d={'a':2;'b':2}


d={}  # 声明一个字典
for i in s:
    d[i]=d.get(i,0)+1  

# 如果这个键不存在,就添加这个键在字典中并且把其值赋为1
# 如果这个键存在,就把它的值加一

d={'B':3,'A':3,'C':2}

这不就完美符合了我的预期了么

例如样例:BABBACAC

就变为了:{'B':3,'A':3,'C':2}只需要输出它的键就可以了

但是,题中说了如果有多个字母均出现了最多次,按字母表顺序依次输出所有这些字母(字母序)

因为字典是不支持排序的,所以将其转化为列表排序

d={'B':3,'A':3,'C',2}
# 不能使用强制转化
d=list(d)
d=['B','A','C'] 
# 字典(dict)是无序的,它的键(key)和值(value)是没有固定顺序的。当你使用list()函数将一个字典转换为列表时,只会保留字典的键,并且返回的列表是按照键的插入顺序排列的。

应该使用
d=list(d.items())
# d=[('B',3),('A',3),('C',2)]

排序:

d.sort(k=lambda x:x[0])  # 先将列表按照字母的字典序排序
d.sort(k=lambda x:x[1],reverse=True) # 将列表按出现次数逆序排序

输出:

maxn=d[0][1]
for i in range(len(d)):
    if i[1]<maxn:
        break
    print(i[0],end='')

完整代码:

s=input()
d={}
for i in s:
 d[i]=d.get(i,0)+1
d=list(d.items())
d.sort(key=lambda x:x[0])
d.sort(key=lambda x:x[1],reverse=True)
maxn=d[0][1]
for i in ld:
 if i[1] <maxn:
     break
 print(i[0],end="")

总结:

j今天的题都很简单(有一道难题想了1个小时没做出来)。在做题的时候一定要仔细审题。还有对于一些基础数据结构一定要清晰。加油明天继续更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值