Leetcode新手入门130 Day3
- ==可迭代对象==
- ==不可迭代对象==
- ==切片[]==
- ==str.join()==
- ==n.pop(下标)==
- ==n.remove(值)==
- ==n.reverse()==
- ==del list[idx]==
- ==DP 本质:==
- ==print(*n) 解包**位置参数**(列表 / 元组)==
- ==集合==
- ==enumerate==
- ==str.count(子串)==
- noob41 神秘石像的镜像序列
- noob42 左侧严格小于计数
- noob43 牛牛写作业
- noob44 数组技术维护
可迭代对象
能够被逐个取出元素的对象
可以用在for循环,*解包,[]切片,list()转换
字符串str
列表list
元组tuple
集合set
字典dict
range对象()
文件对象、生成器
不可迭代对象
int整数
float浮点数
bool布尔值
切片[]
[:n] # 取前 n 个
[-n:] # 取最后 n 个
[:-n] # 去掉末尾 n 个
[::-1] # 反转
[::2] # 步长2,隔一个,取一个
str.join()
join 是字符串的方法,用法为「分隔符字符串.join(序列)」。
它会把序列里的所有元素拼接成一个字符串,并在相邻元素之间插入这个分隔符。
⚠️ 注意:序列中的元素必须全部是字符串,不能直接放数字!
print(‘ ’.join(map(str,list)))
n.pop(下标)
n 必须是列表 list,pop() 是列表的内置方法,用法为「列表.pop([下标])」。
n.pop() 不带参数时,默认删除列表的最后一个元素。
n.remove(值)
按照元素删除
只删除第一个匹配的值
n.reverse()
.reverse()是列表方法,字符串没有 reverse 方法
del list[idx]
按照下标删除
写法 删除依据 返回值
list.pop(idx) 下标 返回被删掉的元素
del list[idx] 下标 无返回值
list.remove(val) 元素值 无返回值,删除第一个等于 val 的元素
DP 本质:
- 拆分问题;
- 子问题结果存储(dp 数组),避免重复计算;
- 大问题的解由更小子问题的解推出;
- 子问题一旦算出,不再改变(无后效性)。
不是所有题目都能用 DP!必须满足:重叠子问题 + 最优子结构 + 无后效性。
print(*n) 解包位置参数(列表 / 元组)
把 n 里面每一项拆开,空格分隔打印出来,不带括号。
集合
{要放进集合的元素 for 循环变量 in 可迭代对象 if 条件}
enumerate
遍历可迭代对象a,同时返回:下标+对应元素
str.count(子串)
统计一个字符串中,某个子串一共出现了多少次
字符串.count(要找的子串)
返回值:出现的总次数
====================
noob41 神秘石像的镜像序列
# 可以建一个空的列表# 也可以建一个 0 列表,替换,让 doubao 评估一下是否有意义,还是只有二维有意义num=[1,2,3,4],n=4,dp=[0,0,0],idx=0# 下标逻辑,一定要搞清楚-i=3:dp[0]=4,idx=1-i=2:dp[1]=3,idx=2-i=1:dp[2]=2,idx=3👉 此时 idx=3,dp 最大下标是2,下一轮-i=0:执行 `dp[3]=num[0]` → `dp[3]` 不存在,直接报错!noob42 左侧严格小于计数
双指针
i负责遍历
j负责计数
# 最开始写成了单层嵌套,n=int(input())a=list(map(int,input().split()))dp=[0]*n min_val=min(a)max_val=max(a)# 获取所有最小、最大元素下标min_idx_set={ifori,numinenumerate(a)ifnum==min_val}max_idx_set={ifori,numinenumerate(a)ifnum==max_val}term=0s=0foriinrange(n):ifiinmax_idx_set:dp[i]=i# 最大值:dp等于下标elifiinmin_idx_setori==0:dp[i]=0# 最小值 或者 i=0:dp置0else:ifa[i]>a[i-1]:term=term+1s=s+term dp[i]=sprint(*dp)noob43 牛牛写作业
行号不一定要分类讨论,用2n+1,2n+2也可以
s/n可以放在输出里
importsys lines=sys.stdin.read().splitlines()T=int(lines[0])foriinrange(T):n=int(lines[2*i+1])a=list(map(int,lines[2*i+2].split()))mina=min(a)maxa=max(a)pole=maxa-mina ave=sum(a)/n s=0forjinrange(n):s=s+(a[j]-ave)**2print(pole,f"{s/n:.3f}")noob44 数组技术维护
lines = sys.stdin.read().splitlines()
importsys lines=sys.stdin.read().splitlines()T=int(lines[0])foriinrange(T):n,k=list(map(int,lines[2*i+1].split()))a=list(map(int,lines[2*i+2].split()))S=0cnt=0forjinrange(n):ifa[j]>=k:S=S+a[j]ifa[j]==0andS>=1:S-=1cnt+=1else:passprint(cnt)