Python 进阶题(不定更) 1
本帖最后由 沉默的人e 于 2020-5-19 08:42 编辑Python advanced quiz (Update from time to time)
The whole quiz is written in English.
The Chinese version is on page 2
Hello everyone. I am "dscilence", your fish oil.(fish oil...)
This is Python Quiz Question written in English. As you see, the article is written in English. (English, I hate English)
And the most important thing is that, this series of Python quiz is a little bit difficult, compared with the post named "Python 练习题(争取月更)"
So if you don't like English, or you find it hard to solve, please move to other exercises, and please don't insult this post.
The question is:
Students are asked to stand in a specific order of heights for an annual photo.
Return the minimum number of students that must move in order for all students to be standing in the order of height.
Notice that when a group of students is selected they can reorder in any possible way between themselves, and the non selected students remain on their seats.
Let me give you some examples to make you know what the specific order is.
Suppose that there are 5 students, and their heights are maked by 1,2,3,4,5.
Once they are standing like this, which is the input value:
You need to sort them and make them stand like this:
Then calculate the minimum students you move,which is the output value.
For this example, the minimum students is 5, the reason is as follow:
on index 0, we have 1 vs 2, so we need to move this student.
on index 1, we have 2 vs 4, so we need to move this student.
on index 2, we have 3 vs 5, so we need to move this student.
on index 3, we have 5 vs 3, so we need to move this student.
on index 4, we have 4 vs 1, so we need to move this student.
Python进阶题(不定时更新)
全文由中文书写
英文请见第一页
各位鱼油大家好,我又来散财了.
先跟大家说一下,从本帖子发出开始,原来的Python练习题,将由原来的50个鱼币一道题,降为25鱼币一道题.
本系列题目如果不出问题,将会为50鱼币一道题,但是,由于资金短缺,一个月75...
所以本系列题目不定时更新.(当然大家也不一定愿意看我在这叨叨叨)
如果认为题目难,或者不喜欢,请移步到其他人的题目中.
进入正题
相信各位在看了第一页的英文以后,整个人是傻了的,可能直接就到第二页了,也可以理解,但还是希望各位做完题以后,回去看看英文.
虽然我不能对我的英文有吉大的自信(你还有清华的自信?)
出英文的目的,是让大家熟悉环境,毕竟当初不是咱们看发的语言.而且我觉得就算是咱们开发的语言也很难用中文,为什么,太麻烦了,你需要在ASCII跟拓展ASCII之间来回转化.(个人感觉,不喜勿喷,本人已怕)
扯远了,当各位以后如果走计算机,要看很多资料,很多一手资料是英文写的,这是毋庸置疑的,所以大家还是要多学学英文,多熟悉熟悉环境.
好了,现在开始看题:
假设有一群小朋友站成一排准备照合影(就一排,别管他多长)
要为他们按照特定的身高顺序排序.
请你返回排序时移动的最少人数.
下面举例,让各位明白这个特定顺序是啥:
假设这群小朋友身高编号是这样的:1,2,3,4,5
一次合影时,他们排成的顺序是这样的,这是你的输入值
需要将他们进行调整,调整之后的顺序是这样的:
就是大个在中间,小个在两边,按照左边大右边小的方式排序,如果是六个人也是一样,两个大个的按照左边大右边小的方式排中间.就是(这段没有对应的英文)就是这个图:再比如,如果是七个人,分别是经过这样的顺序排列,应该是
现在算如果移动这些人,最少移动几个.
对于五个人的移动后是
最少移动5个人,原因如下:
0号位,是1对2,动
1号位,是2对4,动
2号位,是3对5,动
4号位,是5对3,动
5号位,是4对1,动
最少五个
不讲故事,干活就是,把一个以数字为元素的列表的顺序调整为中间大两边小,两个以中间元素为轴对称的元素,满足左边的比右边的大.,再次上图
请大家用Python面向对象的方式解答此问题,本系列的内容,最先答出来,正确的,且没有废话的,奖励50鱼币,时限7天,闰四月初一收题,过期之后,将不再查看各位鱼油的答案.当然,具体以实际情况为准.
本帖最后由 咸鱼c1 于 2020-5-19 16:19 编辑
我之前可能想复杂了{:10_261:}{:10_261:}{:10_261:}
先排个序然后分成两个列表,一个奇数位置的,一个偶数位置的,然后奇数位置的翻转,再拼接起来就是答案了,最后和源列表对比一下就行
def fun(list1):
n=len(list1)
list2=list1[:]
list2.sort()
temp1=list2
temp2=list2
temp1.sort(reverse=True)
ret=temp2+temp1
cnt=0
for i in range(n):
if ret!=list1:
cnt+=1
return cnt
没看懂 本帖最后由 咸鱼c1 于 2020-5-19 07:28 编辑
看不懂题目,按照正常拍照就是中间大两边小,写了个全排列,{:10_260:}{:10_260:}
from itertools import permutations
def fun(list1):
line=list(permutations(list1))
n=len(list1)
mi=n
f=1
ret=[]
for i in line:
cnt=0
f=1
if i!=max(i) or i<i or i>i:
f=0
continue
for j in range(1,n//2 if n%2 else n//2-1):
if i<i or i>i:
f=0
break
if not (i>=i and i<=i):
f=0
break
if f:
for j in range(n-2,n//2 if n%2 else n//2-1,-1):
if not (i>=i and i<=i):
f=0
break
if f:
for k in range(n):
if(i!=list1):
cnt+=1
if cnt<=mi:
mi=cnt
ret=i[:]
return mi,ret
算了三种{:10_245:}
fun()=(5, (2, 4, 5, 3, 1))
fun()=(6, (2, 4, 6, 5, 3, 1))
fun()=(6, (2, 4, 6, 7, 5, 3, 1)) 下面举例,让各位明白这个特定顺序是啥:说实话,我没看懂这个特定顺序,两个例子不足以描述清楚这个规则。
还有class Solution:
def func(*args):
pass这样的是不是也要算面向对象? 永恒的蓝色梦想 发表于 2020-5-19 08:11
说实话,我没看懂这个特定顺序,两个例子不足以描述清楚这个规则。
算
...好吧一会改一下文字 本帖最后由 沉默的人e 于 2020-5-19 08:43 编辑
{:5_100:}好吧,审稿没申好,左边大,右边小.
欢迎各位挑错 沉默的人e 发表于 2020-5-19 08:26
好吧,审稿没申好,左边大,右边小.
欢迎各位挑错
我不是很讨厌英语,就是讨厌一大段翻译不了的英语{:10_243:} 沉默的人e 发表于 2020-5-19 08:26
好吧,审稿没申好,左边大,右边小.
欢迎各位挑错
输入列表是否有重复项? 永恒的蓝色梦想 发表于 2020-5-19 10:22
输入列表是否有重复项?
可以,相同数据左右分开
排完后是 class Solution():
def __init__(self, height):
self.height = height
self.n = len(height)
def __sort_No(self):# 按身高从小到大排序后的编号
return sorted(range(self.n), key=lambda x: self.height)
def __move(self):# 按规定排序后的编号
sort_no = self.__sort_No()
left = for i in range(1, self.n, 2)]
if self.n % 2 == 0:
right = for i in range(self.n - 2, -1, -2)]
else:
right = for i in range(self.n - 1, -1, -2)]
return left + right
def sort_height(self):# 编号转换成身高输出
move_no = self.__move()
h = for i in move_no]
return h
def step_num(self):# 编号不在自己顺序上的就是需要移动的
move_no = self.__move()
res = 0
for index, value in enumerate(move_no):
if index != value:
res += 1
return res
if __name__ == '__main__':
l =
s = Solution(l)
print(l)
print(s.sort_height())
print(s.step_num())
小白,不知道面向对象的方式解答对不对
思路:
给输入贴上顺序标签,排序后再按要求把标签取出来,最后对应上标签表示的身高
能调用的两个方法分别返回排序后的身高列表和移动次数
12-15行写的不是很好,但是能实现了 咸鱼c1 发表于 2020-5-18 21:57
我之前可能想复杂了
先排个序然后分成两个列表,一个奇数位置的,一个偶数 ...
比较简单得了,最接近最佳答案.先给你最佳答案了,注意下一次要用面向对象的方式
class ...的形式 {:5_95:} 瞎写了一个,不清楚对不对
好歹样例是过去了
def func(lst):
return + lst[::-1]
lst = eval(input()) # 题目中写的输入的是一个列表,我就直接eval处理了
print(func(lst))
思路是先把列表排个序,然后把里面偶数部分提取出来,再加上剩下列表的逆序(从大到小)
页:
[1]