Python:每日一题 320
今天的题目:给定一串英文字母,每次可以删掉一个英文字母,求最少删多少次可以让每个字母出现的次数不同。
示例 1:
输入:"aaabbb"
输出:1
解释:因为 'a' 和 'b' 都有三个,所以删掉一个 'a' 或者一个 'b' 都可以满足题意。
示例 2:
输入:"abcd"
输出:3
解释:因为 'a'、'b'、'c'、'd' 各有一个,所以需要删掉任意三个来满足题意。
{:10_298:}欢迎大家一起答题!{:10_298:} 本帖最后由 最后的魁拔 于 2020-1-31 15:56 编辑
a,b,c,d删除3个,那是不是,b,c,d它们三个次数相同了
def func320(sz:str):
dct={}
for i in sz:
dct=dct.get(i,0)+1
lst=list(dct.values())
lst.sort(reverse=True)
ret,pre=0,0xFFFFFFFF
for i in lst:
pre=max(0,min(i,pre-1))
ret+=i-pre
return ret def solve_320(str1:str):
dict1 = {}
for i in str1:
if i not in dict1:
dict1=1
else:
dict1+=1
count,value = 0,[]
sorted(zip(dict1.values(),dict1.keys()),reverse= True)
for i in dict1.values():
value.append(i)
for j in range(1,len(value)):
if value == 1:
if value == 1:
count+=len(value)-j
else:
count+=len(value)-j-1
break
elif value == value:
value-=1
count+=1
return count
print(solve_320("abcd")) def f320(s):
if len(s)==1:
return 0
d=dict()
for e in s:
d=d.get(e,0)+1
L=sorted(list(d.values()))
l=len(L)
if l==1:
return 0
else:
r=l-2
res=0
while r>=0:
if L>=L:
if L==0:
res+=L
L=0
else:
dd=L-L+1
res+=dd
L-=dd
r-=1
return res 最后的魁拔 发表于 2020-1-31 15:43
不是,删掉 3 个,只剩下一个。 abbaba 这种也算a,b各三个对吧 fan1993423 发表于 2020-1-31 17:10
abbaba 这种也算a,b各三个对吧
对 题目的意思是不是 aaabbb减少任意一个字母 使得a和b的次数不一样 这里就是2和3不一样,然后abcd 减少abc的话 就是0,0,0,1次,0不算,所以1和他们都不同,是这个意思嘛? fan1993423 发表于 2020-1-31 17:21
题目的意思是不是 aaabbb减少任意一个字母 使得a和b的次数不一样 这里就是2和3不一样,然后abcd 减少abc的 ...
是。 wanting-for 发表于 2020-1-31 16:07
解答错误
输入:"aaabbbccc"
输出:1
预期结果:3 zltzlt 发表于 2020-1-31 17:39
解答错误
输入:"aaabbbccc"
def solve_320(str1:str):
dict1 = {}
for i in str1:
if i not in dict1:
dict1=1
else:
dict1+=1
count,value = 0,[]
for i in dict1.values():
value.append(i)
value.sort(reverse = True)
ls = ]
for j in range(1,len(value)):
if value >= min(ls):
if min(ls)==0:
count+=value
else:
count+=(value-min(ls))+1
value = min(ls)-1
ls = value[:j+1]
return count
print(solve_320("abcddajdfhsdfiitujhjsfjajjajjjjjajkakdksakdjkaskjdfhjfjkadawiwuqehuhhdmcnjfhajdnasdlkasdjkaljfheufhauiiqedqwioiadfnc"))
菜鸟与大佬的差距就是,大佬啥都考虑的清清楚楚。而我就漏这漏那,不严谨.... 本帖最后由 fan1993423 于 2020-1-31 18:56 编辑
from collections import Counter
def fun320(s):
lst=sorted(list(Counter(s).values()),reverse=True)
count=0
def loop(lst):
nonlocal count
if 0 in lst:
index0=lst.index(0)
if len(lst[:index0])==len(set(lst[:index0])):
return count
if len(lst)==len(set(lst)):
return count
for i in lst:
if lst.count(i)!=1:
lst-=1
count+=1
return loop(sorted(lst,reverse=True))
else:
lst.remove(i)
return loop(lst)
娱乐向解题,嗯,好像是。(AWA)
def solve(s:str)->int:
'''
给定一串英文字母,
每次可以删掉一个英文字母,
求最少删多少次可以让每个字母出现的次数不同。
'''
log = #人口普查
log.sort(reverse=True)
res = 0
for i in range(len(log)): #计算排队喊号
while log and log.count(log)-1: #能提前就提前
log -= 1
res += 1
return res #编不下去了
if __name__ == '__main__':
print('示例1 输出:',solve("aaabbb"))
print('示例2 输出:',solve("abcd"))
阴阳神万物主 发表于 2020-1-31 18:41
娱乐向解题,嗯,好像是。(AWA)
{:10_250:}想象力真丰富 阴阳神万物主 发表于 2020-1-31 18:41
娱乐向解题,嗯,好像是。(AWA)
是啊,我又想多了,原来可以这么巧 本帖最后由 SHRS23 于 2020-1-31 20:45 编辑
string = input('输入字符串:')
list1 = * 26
for each in string:
list1 += 1
list1.sort(reverse = True)
#print(list1)
count = 0
finish = False
while not finish:
for i in range(26):
if list1 == 0:
finish = True
break
if list1 != list1:
continue
#print(i)
list1 -= 1
count += 1
list1.sort(reverse = True)
break
print(count)
请版主帮忙测试{:5_109:} 本帖最后由 TJBEST 于 2020-1-31 21:47 编辑
非常朴素的做法
def fun320(string):
dictionary = dict()
for each in string:
try:
dictionary += 1
except KeyError:
dictionary = 1
data = list(dictionary.values())
data.sort()
data.reverse()
M = len(data)
result = 0
for i in range(0,M-1):
temp = data
if temp > data:
for m in range(i+1,M):
if data == temp:
data = temp - 1
result += 1
else:
break
else:
if i + temp <= M:
res = ((temp + 1)*temp)//2
else:
res = ((M - i)*(2*temp + i - M +1))//2
result += (M-i)*temp-res
break
return result 阴阳神万物主 发表于 2020-1-31 18:41
娱乐向解题,嗯,好像是。(AWA)
思路一样{:10_266:}
def func320(s):
templist =
templist.sort(reverse=True)
result, length = 0, len(templist)
for ind in range(length):
if len(set(templist)) != length:
num = templist.count(templist)
for i in range(ind + 1, ind + num):
templist -= 1
result += 1
else:
break
return result def fun320(x):
a = set(x)
b = set()
result = 0
l = []
for each in a:
l.append(x.count(each))
l.sort(reverse = True)
for each in l:
if each not in b and each != 0:
b.add(each)
continue
else:
while each in b and each != 0:
each -= 1
result += 1
b.add(each)
return result
print(fun320("aaabbbccc"))
感觉我每次写的思路都比较奇葩。。。。