Python每日一练
文章目录
- Python每日一练
- 前言
- 一、硬币的面值
- 二、奇偶排序
- 三、陶陶摘苹果
- 总结
前言
很显然,Python的受众远远大于C++,其实笔者本人对Python的理解也是远强于C++的,C++纯粹是为了假装笔者是个职业选手才随便玩玩的,借着十多年前学的C的功底,强行假装的。
因职业原因,Python更适用于运维、网络、AI方向,所以用得很多。最近假装职业码农装过头了,写点Python代码都习惯性加 ; 了,更离谱的是CSDN对笔者的能力判断中,C++一个劲地涨,Python都连能力都没了…
所以以后也要用Python来解解题,经常锻炼一下。
提示:以下是本篇文章正文内容,下面案例可供参考
一、硬币的面值
这题前些天用C++做过,正好拿Python来试试。
题目描述:
小A有n枚硬币,现在要买一样不超过m元的商品,他不想被找零,同时又不想带太多的硬币,且硬币可以重复,现在已知这n枚硬币的价值,请问最少需要多少硬币就能组合成所有可能的价格?
输入描述:
第一行两个数:n、m。 下一行,共n个数字,表示硬币的面值。
输出描述:
一行一个数,表示最少需要多少硬币。如果无解请输出“No answer!!!”
示例1
输入
5 31
1 2 8 4 16
输出
5
代码如下(示例):
class Solution:
def __init__(self) -> None:
pass
def solution(self, n, m, arr):
result = None
# TODO: 请在此编写代码
arr.sort()
tmp = 0
i = 0
if arr[0] != 1:
return "No answer!!!"
result = 0 # 在某些解释器下可能需要,因为None不能与int运算
while tmp < m and i <= n-1:
if tmp+1 < arr[i+1]:
tmp += arr[i]
result += 1
elif tmp+1 == arr[i+1]:
tmp += arr[i+1]
result += 1
i += 1 # 可省,加了可以减少循环次数
else:
i += 1
if i == n-1:
result += (m-tmp)/arr[n-1] + bool((m-tmp)%arr[n-1])
break;
return int(result)
if __name__ == "__main__":
arr_temp = [int(item) for item in input().strip().split()]
n = int(arr_temp[0])
m = int(arr_temp[1])
arr = [int(item) for item in input().strip().split()]
sol = Solution()
result = sol.solution(n, m, arr)
print(result)
首先,我们要理解题意,这题说简单点就是要求你带上一堆硬币,可以凑出1到m毛钱的任意组合。
所以我们先判断硬币中是不是有1毛的,没有就肯定不行。
然后就简单了,为了组成1-m的任意组合,我们来看个例子:
1+2+4,这三个硬币可以组成1到7毛的任意组合。所以我们取硬币的时候要取大于已取的总合1毛的硬币。这个情况下就要取一个8毛的硬币的了,如果有就取8毛,如果没有就再取一个4毛,以此类推。
下一个要取的硬币取决于手上已有硬币的总合,如此循环到最大面值的硬币,就不用再用循环来取了,直接用m-已取的总合除以最大面值,就得出了总数,这里可能存在不能整除的情况,所以加了一句bool((m-tmp)%arr[n-1])
用于判断是不是整除,不是就多加一个最大面值。bool值是0或1,正好可以用于相加。
逻辑和C++写的代码一样,这里因为做过省去了判断n数量的几行代码,主要是省了当硬币面值存在0的情况的判断。
逻辑其实是比较简单的,用算法思想来看,这属于动态规划法,看python的同鞋可能对算法都比较陌生,其实大可不必!就是一些解决问题的思想而已,如果有人看,以后出个专栏用python解释常用算法,笔者这方面也仅限于常见的算法能用,一些很高级的也玩不转。
二、奇偶排序
题目描述:
给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。(测试用例仅做参考,我们会根据代码质量进行评分)
输入描述:
第一行输入整数n。(1<=n<=1000)表示数组大小 第二行输入n个整数a.(1<=n<=100)
输出描述:
输出重排之后的数组。
示例:
输入
6
3 34 67 89 90 58
输出
3 67 89 34 90 58
代码如下(示例):
class Solution:
def __init__(self) -> None:
pass
def solution(self, n, arr):
result = None
# TODO: 请在此编写代码
result = []
tmp = []
for i in arr:
if i%2 != 0:
result.append(str(i)) # 用str(i)是为了配合输出语句:print(" ".join(result))
else:
tmp.append(str(i))
for i in tmp:
result.append(i)
return result
if __name__ == "__main__":
n = int(input().strip())
arr = [int(item) for item in input().strip().split()]
sol = Solution()
result = sol.solution(n, arr)
print(" ".join(result))
这题非常简单,实在没啥好说的,这里在一次循环中判断是奇数还是偶数,为了不打乱偶数顺序,所以先放入tmp列表中。最后在奇数排完后,添加到result列表中,能略微减少循环。是用空间换时间的做法,在这个内存不值钱的年代,还是有点意义的。
三、陶陶摘苹果
题目描述:
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 10 个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个 30 厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。 现在已知 10 个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。
输入描述:
输入包括两行数据。第一行包含 10 个 100 到 200 之间(包括 100 和 200 )的整数(以厘米为单位)分别表示 10 个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个 100 到 120 之间(包含 100 和 120 )的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。
输出描述:
输出包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。
示例:
输入
100 200 150 140 129 134 167 198 200 111
110
输出
5
代码如下(示例):
class Solution:
def __init__(self) -> None:
pass
def solution(self, heights, max_tourch_height):
# 不正经的lambda写法,map接收函数作为参数,将其映射于列表的各个元素,返回一个迭代器,list转换,sum求和
result += sum(list(map(lambda x: bool(x<=max_tourch_height+30), heights)))
# 另一个不正经的一行写法 ,直接列表生成bool值,用sum求和即可
result += sum([(i<=max_tourch_height+30) for i in heights])
# TODO: 请在此编写代码
# 以下是正经写法:
for i in heights:
if i<= max_tourch_height + 30:
result += 1
return result
if __name__ == "__main__":
heights = [int(item) for item in input().strip().split()]
max_tourch_height = int(input().strip())
sol = Solution()
result = sol.solution(heights, max_tourch_height)
print(result)
实在太简单了,可以用一个lambda函数一行解决,不过lambda不好理解,用列表生成式一行解决也可以,老实写三行更容易理解。三个解法取一个即可!注意注释掉另两种写法
总结
Python真香~