终于在卡了好几天之后想到了解决办法,这道题给出的代码并不能保证完全成功,不超时的概率大概在50%
一、最初的代码
这个问题一般解决思路如下:
- 获得正序链表;
- 根据条件反转链表;
- 输出链表;
代码如下:
#!/usr/bin/env python
# -*-coding:utf-8 -*-
'''
@File : test.py
@Time : 2020/04/01 10:24:29
@Author : Schiller Xu
@Version : 1.0
@Contact : schillerxu@qq.com
@License : (C)Copyright 2020-2021, SchillerXu
@Desc : None
'''
data=input().split()
first=data[0]
n=int(data[1])
k=int(data[2])
nodes=[input().split() for i in range(n)]
r=[]
result=[]
while first!='-1':
for node in nodes:
if node[0]==first:
first=node[2]
r.append(node)
break
for i in range(0,n,k):
if len(r[i:i+k])==k:
temp=r[i:i+k]
temp.reverse()
result+=temp
else:
result+=r[i:i+k]
break
#range(n-1)会有一个错误
for i in range(len(result)-1):
result[i][2]=result[i+1][0]
result[-1][2]='-1'
for r in result:
print("{0[0]} {0[1]} {0[2]}".format(r))
有一个超时
二、代码改进
尝试过在获取正常链表的同时进行反转,每读取k个正常数据进行反转一次,但是最终的效率并没有提高多少。
最后想到可以不反转链表,直接控制链表的输出就行。控制输出的时候,可以用数据1-8,间隔为3自己推演下,代码有点乱。
#!/usr/bin/env python
# -*-coding:utf-8 -*-
'''
@File : 1025-1.py
@Time : 2020/07/11 19:26:26
@Author : Schiller Xu
@Version : 1.0
@License : (C)Copyright 2020-2021, SchillerXu
@Desc : None
'''
import sys
first_node,n,k=sys.stdin.readline().split()
n=int(n)
k=int(k)
#address-data
ad=dict()
#address-next
an=dict()
r=[]
#读取数据,生成字典
for _ in range(n):
a,d,n=sys.stdin.readline().split()
ad[a]=f'{a} {d}'
an[a]=n
#获得正序链表
while first_node!='-1':
r.append(first_node)
first_node=an[first_node]
#按照要求输出“反转”链表
lens=len(r)
ind=lens//k
for i in range(ind-1):
for j in range((i+1)*k-1,i*k,-1):
sys.stdout.write(f'{ad[r[j]]} {r[j-1]}\n')
sys.stdout.write(f'{ad.get(r[i*k])} {r[(i+2)*k-1]}\n')
for j in range((ind)*k-1,(ind-1)*k,-1):
sys.stdout.write(f'{ad[r[j]]} {r[j-1]}\n')
try:
sys.stdout.write(f'{ad.get(r[(ind-1)*k])} {r[(ind)*k]}\n')
except:
sys.stdout.write(f'{ad.get(r[(ind-1)*k])} -1\n')
exit()
for j in range((ind)*k,lens-1):
sys.stdout.write(f'{ad.get(r[j])} {r[j+1]}\n')
sys.stdout.write(f'{ad.get(r[-1])} -1\n')
有一个程序运行399ms的没截下来,这道题目实在是丧心病狂。