一、题目:
说孙悟空变出了多跟金箍棒,每根金箍棒的长度不一样。 他们叫互相吵闹。因此,悟空定住一根最长的金箍棒。其余的金箍棒变长。 直到所有金箍棒的长度一样长后才会和平相处。
样例如下:
输入 : [2,3,4]
过程1: [3,4,4]
过程2: [4,4,5]
输出 : [5,5,5]
二、解法
一(递归)
1.解题思路
利用递归方法,每次我们只定住最大值,其余的元素都+=1. 递归跳出条件是列表中的所有的元素都相等。
2.解题代码:
'''
_*_ coding: utf-8 _*_
@File : 蓝桥杯国赛-孙悟空金箍棒.py
@Version : 1.0
@Author : Solar Lee
@Time : 2021/05/29 14:22:45
Description:
孙悟空的金箍棒问题解决方法。
'''
import time
def equal_l(l: list) -> bool: # 判断列表是否所有的元素都相等。
for i in l:
if i != l[0]:
return False
return True
def solution(l: list) -> list:
global count
n = max(l)
max_index = l.index(n)
if equal_l(l):
print(f'孙悟空点击次数为:{count}次')
return l
else:
for i in range(len(l)):
if i != max_index:
l[i] += 1
print(l)
count += 1
solution(l)
if __name__ == '__main__':
count = 0
start_time = time.time()
solution([2, 3, 4])
end_time = time.time()
print(end_time-start_time)
3. 运行结果:
输入:2 3 4
输出:孙悟空点击的次数为3次。每次进入递归都会打印出当前的列表状态。
二(数学简化版)
1.解题思路:
因为本题中只要求解孙悟空要点击的次数,我们不用每次的列表都求出来。 通过数学计算,这个问题可以简化得到孙悟空要点击的次数= 列表中的所有的数字都减去最小数字,在求和就可以了。
2.解题代码:
'''
_*_ coding: utf-8 _*_
@File : 蓝桥杯国赛-孙悟空金箍棒.py
@Version : 1.0
@Author : Solar Lee
@Time : 2021/05/29 14:22:45
Description:
孙悟空的金箍棒问题解决方法。
'''
import time
def solution(l: list) -> int:
n = min(l)
result = 0
for i in l:
result += i-n
return result
if __name__ == '__main__':
l = list(map(int, input().split()))
start_time = time.time()
print(f'孙悟空的点击次数为:{solution(l)}次')
end_time = time.time()
print(end_time-start_time)
3.运行结果:
输入:3 4 5
输出结果:孙悟空的点击次数为:3次.
注意: 这个解法是不会打印出列表状态。
三、 总结
- 本题用递归比较容易想出解法。 当然也可以用循环遍历来解决。但是时间复杂度和空间复杂度比较高。
- 本题用简单的数学方法可以大大简化代码,提高运行效率。
- 大家有兴趣可以测试下运行时间。