一、排列字母
题目
思路
模拟
代码
n = "WHERETHEREISAWILLTHEREISAWAY"
print("".join(sorted(n)))
二、统计数字
题目
思路
利用字典记录出现数字出现次数
代码
##import functools
n = int(input())
a = dict()
b = []
for i in range(n):
t = int(input())
if t in a.keys():
a[t] += 1
else:
a[t] = 1
b.append(t)
##def mycmp(x,y):
## if a[x] > a[y]:
## return 1
## elif a[x] <a[y]:
## return -1
## else:
## return 0
b.sort()
for i in b:
print(i,a[i])
三、错误票据
题目
思路
前后差值为1正常,差值为2是缺失,差值为0是重复
代码
n = int(input())
a = []
for i in range(n):
a.extend(list(map(int,input().split())))
a.sort()
for i in range(1,len(a)):
if a[i]-a[i-1] == 0:
surplus = a[i]
if a[i]-a[i-1] == 2:
absent = a[i]-1
print(absent,surplus)
四、奖学金
题目
思路
- 三次排序,先学号,再语文成绩,再总分
- 利用functools.cmp_to_key(),然后自己编写二元函数mycmp()自己定义“大”“小”
代码
三次排序
n = int(input())
a = [0]*n
for i in range(n):
temp = list(map(int,input().split()))
a[i] = [i+1,sum(temp),temp[0]]
a.sort(key = lambda x:x[0])
a.sort(key = lambda x:x[2],reverse = True)
a.sort(key = lambda x:x[1],reverse = True)
for i in range(5):
print(a[i][0],a[i][1])
自定义key
import functools
n = int(input())
a = [0]*n
def mycmp(x,y):
if x[1] != y[1]:
if x[1] > y[1]:
return 1
else:
return -1
elif x[2] != y[2]:
if x[2] > y[2]:
return 1
else:
return -1
else:
if x[0] < y[0]:
return 1
else:
return -1
for i in range(n):
temp = list(map(int,input().split()))
a[i] = [i+1,sum(temp),temp[0]]
a.sort(key = functools.cmp_to_key(mycmp),reverse = True)
for i in range(5):
print(a[i][0],a[i][1])
五、双向排序
题目
思路
暂无,等学到后面回来补坑
代码
##暂无,等学到后面回来补坑
六、第几个幸运数字
题目
思路
1.模拟
这里直接模拟需要注意的事情挺多的,sort()位置不同结果截然不同,差之毫厘,谬以千里!
import sys
a = [3,5,7]
k = 0
while True:
for i in range(3):
temp = a[k]*a[i]
if temp not in a:
a.append(temp)
## 下面的if语句如果写成 if temp > 2**50:将会是一个灾难!
if temp > 2**100:
a.sort()
print(a.index(59084709587505)+1)
sys.exit(0)
k += 1
如果sort()位置提到前一个判断呢?
import sys
a = [3,5,7]
k = 0
while True:
for i in range(3):
temp = a[k]*a[i]
if temp not in a:
a.append(temp)
## sort()放到这里了!
a.sort()
## 现在不会是一个灾难,为啥呢?φ* ̄0 ̄
if temp > 2**50:
print(a.index(59084709587505)+1)
sys.exit(0)
k += 1
2^50 到2^100?
这是因为如果再每次插入时就进行排序,这样可以保证下一次生成新的数字相对会是升序,而不是有时升有时降,这时只要大于2**50就可以保证前面的数字生成完了,不过在中间有点疑惑,就是每次都是从a[k]生成,那么会不会因为排序后打乱了呢?我感觉不会,可能是这发展速度太快了,一个变三个。
2 暴力搜
这个就是无脑生成然后搜索,感觉这个更靠谱,还是这个好( ̄▽ ̄)
代码
模拟
import sys
a = [3,5,7]
k = 0
while True:
for i in range(3):
temp = a[k]*a[i]
if temp not in a:
a.append(temp)
## sort()放到这里了!
a.sort()
## 现在不会是一个灾难,为啥呢?φ* ̄0 ̄
if temp > 2**50:
print(a.index(59084709587505)+1)
sys.exit(0)
k += 1
暴力搜
cnt = 0
for i in range(50):
for j in range(50):
for k in range(50):
a = 3**i
b = 5**j
c = 7**k
if a*b*c <= 59084709587505:
cnt += 1
print(cnt-1)
附加题:
小明的衣服
题目
思路
哈夫曼树,是的没错,就是这个思想,你可把每次去染色看成一个类别被分离出来,不断二分,相对的可以认为运费越高就是编码出现的频率越高、越重要,那么相对的它在哈夫曼树的深度越浅。
代码
## 后面补坑