题解 | 【python3】序列操作

【模板】序列操作

https://www.nowcoder.com/practice/12da4185c0bb45918cfdc3072e544069

import sys
input = sys.stdin.readline


class Solution:
    def __init__(self):
        self.s = []

    def solve(self,arr):
        result=None
        if arr[0] == 1:
            self.s.append(arr[1])
        elif arr[0] == 2:
            if arr:
                self.s.pop()
        elif arr[0] == 3:
            print(self.s[arr[1]])
        elif arr[0] == 4:
            self.s.insert(arr[1]+1,arr[2])
        elif arr[0] == 5:
            self.s.sort()
        elif arr[0] == 6:
            self.s.sort(reverse=True)
        elif arr[0] == 7:
            print(len(self.s))
        elif arr[0] == 8:
            print(*self.s)

if __name__ == "__main__":
    sol = Solution()
    n = int(input()) # 第一行表示输入行数
    for _ in range(n):
        arr = list(map(int,input().split()))
        sol.solve(arr)

你这题现在的核心问题不是“序列逻辑不会”,而是 输出控制列表操作写法 出了几个典型错误。

先说你现在为什么会输出一堆 None

1. 你把每次操作的返回值都 print

你主程序里写的是:

print(sol.solve(arr))

但这题只有操作 3 / 7 / 8 需要输出。

你现在的 solve() 里,像操作 1、2、4、5、6 都没有真正需要输出的内容,所以 result 还是 None,于是就被打印出来了。

这就是你右下角出现:

None
None
2
None
[8, 9, 6]

的原因。

2. sort() 的返回值不是排序后的列表,而是 None

你写了:

self.s = self.s.sort()

这是错的。

因为 Python 的 list.sort()原地排序,返回值是 None,所以这一句执行后:

self.s = None

整个列表就没了。

正确写法:

self.s.sort()

降序同理,你写的:

self.s = self.s.sort()[::-1]

也不对,因为 self.s.sort() 先返回 None,根本不能切片。

正确写法有两种:

self.s.sort(reverse=True)

或者:

self.s.sort()
self.s.reverse()

3. 操作 8 不能直接返回列表对象

你现在写的是:

result = self.s

这样打印出来会变成:

[8, 9, 6]

但题目要求的是:

8 9 6

也就是元素之间空格分隔,不要方括号、不要逗号。

所以操作 8 要写成:

print(*self.s)

或者:

print(' '.join(map(str, self.s)))

4. if arr: 这个判断没意义

你这里:

elif arr[0] == 2:
    if arr:
        self.s.pop()

arr 一定有内容,因为它本身就是一条操作指令,比如 [2]

你真正想判断的应该是序列 self.s 是否为空。但题目已经保证删除时序列非空,所以这里甚至不用判断,直接:

self.s.pop()

5. s=[] 写成类属性了,容易埋坑

你写的是:

class Solution:
    s = []

这会让 s 变成类变量,不是实例变量。虽然这题可能也能跑,但这是不推荐的。

更稳妥的写法是放到初始化函数里:

class Solution:
    def __init__(self):
        self.s = []

你这题应该怎么改

最简单的思路是:

  • 修改序列:不返回值
  • 遇到 3 / 7 / 8:直接输出

这样最清楚。

正确写法

import sys
input = sys.stdin.readline

class Solution:
    def __init__(self):
        self.s = []

    def solve(self, arr):
        op = arr[0]

        if op == 1:
            self.s.append(arr[1])

        elif op == 2:
            self.s.pop()

        elif op == 3:
            print(self.s[arr[1]])

        elif op == 4:
            self.s.insert(arr[1] + 1, arr[2])

        elif op == 5:
            self.s.sort()

        elif op == 6:
            self.s.sort(reverse=True)

        elif op == 7:
            print(len(self.s))

        elif op == 8:
            print(*self.s)

if __name__ == "__main__":
    sol = Solution()
    n = int(input())
    for _ in range(n):
        arr = list(map(int, input().split()))
        sol.solve(arr)

你这题的一个关键理解

这题本质上是“模拟”:

  • 1 x:尾部插入
  • 2:尾删
  • 3 i:查询第 i 个
  • 4 i x:插到 ii+1 中间,也就是 insert(i+1, x)
  • 5:升序
  • 6:降序
  • 7:输出长度
  • 8:输出整个序列

所以最重要的是:

不是每个操作都有返回值,很多操作只是修改状态。

你这份代码最该记住的两个坑

坑 1:不要写

self.s = self.s.sort()

坑 2:不要无脑

print(sol.solve(arr))

应该是谁要输出,谁单独输出。

#python3#
全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务