题解 | 【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:插到i和i+1中间,也就是insert(i+1, x)5:升序6:降序7:输出长度8:输出整个序列
所以最重要的是:
不是每个操作都有返回值,很多操作只是修改状态。
你这份代码最该记住的两个坑
坑 1:不要写
self.s = self.s.sort()
坑 2:不要无脑
print(sol.solve(arr))
应该是谁要输出,谁单独输出。
#python3#
查看12道真题和解析