1025 反转链表python3无超时

终于在卡了好几天之后想到了解决办法,这道题给出的代码并不能保证完全成功,不超时的概率大概在50%

一、最初的代码

这个问题一般解决思路如下:

  1. 获得正序链表;
  2. 根据条件反转链表;
  3. 输出链表;

代码如下:

#!/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的没截下来,这道题目实在是丧心病狂。
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值