鱼C论坛

 找回密码
 立即注册
查看: 1828|回复: 13

[已解决]Python 进阶题(不定更) 1

[复制链接]
发表于 2020-5-18 21:57:34 | 显示全部楼层 |阅读模式
50鱼币
本帖最后由 沉默的人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:
[1,2,3,5,4]
You need to sort them and make them stand like this:
[2,4,5,3,1]
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.

最佳答案
2020-5-18 21:57:35
本帖最后由 咸鱼c1 于 2020-5-19 16:19 编辑

我之前可能想复杂了
先排个序然后分成两个列表,一个奇数位置的,一个偶数位置的,然后奇数位置的翻转,再拼接起来就是答案了,最后和源列表对比一下就行
def fun(list1):
    n=len(list1)
    list2=list1[:]
    list2.sort()
    temp1=list2[0::2]
    temp2=list2[1::2]
    temp1.sort(reverse=True)
    ret=temp2+temp1
    cnt=0
    for i in range(n):
        if ret[i]!=list1[i]:
            cnt+=1
    return cnt

最佳答案

查看完整内容

我之前可能想复杂了 先排个序然后分成两个列表,一个奇数位置的,一个偶数位置的,然后奇数位置的翻转,再拼接起来就是答案了,最后和源列表对比一下就行

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
焦健鬼 + 5 + 5 + 3 感谢楼主无私奉献!为你添加点资金

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-18 21:57:35 | 显示全部楼层    本楼为最佳答案   
本帖最后由 咸鱼c1 于 2020-5-19 16:19 编辑

我之前可能想复杂了
先排个序然后分成两个列表,一个奇数位置的,一个偶数位置的,然后奇数位置的翻转,再拼接起来就是答案了,最后和源列表对比一下就行
def fun(list1):
    n=len(list1)
    list2=list1[:]
    list2.sort()
    temp1=list2[0::2]
    temp2=list2[1::2]
    temp1.sort(reverse=True)
    ret=temp2+temp1
    cnt=0
    for i in range(n):
        if ret[i]!=list1[i]:
            cnt+=1
    return cnt

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
沉默的人e + 2 + 2 + 1 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-18 22:02:50 | 显示全部楼层
没看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-19 00:24:48 | 显示全部楼层
本帖最后由 咸鱼c1 于 2020-5-19 07:28 编辑

看不懂题目,按照正常拍照就是中间大两边小,写了个全排列,
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[n//2 if n%2 else n//2-1]!=max(i) or i[0]<i[n-1] or i[0]>i[n-2]:
                                f=0
                                continue
                for j in range(1,n//2 if n%2 else n//2-1):
                        if i[j]<i[n-j-1] or i[j]>i[n-j-2]:
                                f=0
                                break
                        if not (i[j]>=i[j-1] and i[j]<=i[j+1]):
                                f=0
                                break
                if f:
                        for j in range(n-2,n//2 if n%2 else n//2-1,-1):
                                if not (i[j]>=i[j+1] and i[j]<=i[j-1]):
                                        f=0
                                        break
                if f:
                        for k in range(n):
                                if(i[k]!=list1[k]):
                                        cnt+=1
                        if cnt<=mi:
                                mi=cnt
                                ret=i[:]
        return mi,ret
算了三种
fun([1,2,3,4,5])=(5, (2, 4, 5, 3, 1))
fun([1,2,3,4,5,6])=(6, (2, 4, 6, 5, 3, 1))
fun([1,2,3,4,5,6,7])=(6, (2, 4, 6, 7, 5, 3, 1))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-19 08:11:28 | 显示全部楼层
下面举例,让各位明白这个特定顺序是啥:
说实话,我没看懂这个特定顺序,两个例子不足以描述清楚这个规则。


还有
class Solution:
  def func(*args):
    pass
这样的是不是也要算面向对象?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-19 08:15:15 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-5-19 08:11
说实话,我没看懂这个特定顺序,两个例子不足以描述清楚这个规则。


...好吧一会改一下文字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-19 08:26:54 | 显示全部楼层
本帖最后由 沉默的人e 于 2020-5-19 08:43 编辑

好吧,审稿没申好,左边大,右边小.
欢迎各位挑错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-19 09:02:59 | 显示全部楼层
沉默的人e 发表于 2020-5-19 08:26
好吧,审稿没申好,左边大,右边小.
欢迎各位挑错

我不是很讨厌英语,就是讨厌一大段翻译不了的英语
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-19 10:22:14 | 显示全部楼层
沉默的人e 发表于 2020-5-19 08:26
好吧,审稿没申好,左边大,右边小.
欢迎各位挑错

输入列表是否有重复项?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-19 14:06:12 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-5-19 10:22
输入列表是否有重复项?

可以,相同数据左右分开
[1,2,2,4,5]
排完后是[2,4,5,2,1]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-19 16:48:36 | 显示全部楼层
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[x])

    def __move(self):  # 按规定排序后的编号
        sort_no = self.__sort_No()
        left = [sort_no[i] for i in range(1, self.n, 2)]
        if self.n % 2 == 0:
            right = [sort_no[i] for i in range(self.n - 2, -1, -2)]
        else:
            right = [sort_no[i] for i in range(self.n - 1, -1, -2)]
        return left + right

    def sort_height(self):  # 编号转换成身高输出
        move_no = self.__move()
        h = [self.height[i] 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 = [11, 13, 15, 17, 20, 25, 50]
    s = Solution(l)
    print(l)
    print(s.sort_height())
    print(s.step_num())

小白,不知道面向对象的方式解答对不对
思路:
给输入贴上顺序标签,排序后再按要求把标签取出来,最后对应上标签表示的身高
能调用的两个方法分别返回排序后的身高列表和移动次数

12-15行写的不是很好,但是能实现了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-23 21:15:17 | 显示全部楼层
咸鱼c1 发表于 2020-5-18 21:57
我之前可能想复杂了
先排个序然后分成两个列表,一个奇数位置的,一个偶数 ...

比较简单得了,最接近最佳答案.先给你最佳答案了,注意下一次要用面向对象的方式
class ...的形式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-7 10:59:21 | 显示全部楼层

评分

参与人数 1荣誉 -2 鱼币 -2 贡献 -1 收起 理由
沉默的人e -2 -2 -1 请不要无意义灌水!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-2 19:08:54 | 显示全部楼层
瞎写了一个,不清楚对不对
好歹样例是过去了
def func(lst):
    return [lst.pop(lst.index(each)) for each in sorted(lst) if each % 2 == 0] + lst[::-1]

lst = eval(input()) # 题目中写的输入的是一个列表,我就直接eval处理了
print(func(lst))
思路是先把列表排个序,然后把里面偶数部分提取出来,再加上剩下列表的逆序(从大到小)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 21:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表