话不多说,先上两篇代码:
1、C语言版本
#include "stdio.h"
#include "stdlib.h"
typedef struct NodeStruct {
int num;
int addr;
} Node;
int main(){
int i,j,head,N,K,addr;
Node node,nodes[100000];
int arr[100000][2];
scanf("%d %d %d",&head,&N,&K);
for(i=0;i<N;i++){
scanf("%d",&addr);
scanf("%d %d",&arr[addr][0],&arr[addr][1]);
}
addr = head;
for(i=0;addr!=-1;i++){
node.num = arr[addr][0];
node.addr = addr;
nodes[i] = node;
addr = arr[addr][1];
}
N = i;
for(i=0;(N-i)/K!=0;i+=K){
for(j=i;j<(2*i+K)/2;j++){
node = nodes[K+2*i-j-1];
nodes[K+2*i-j-1] = nodes[j];
nodes[j] = node;
}
}
for(i=0;i<N-1;i++){
printf("%05d %d %05d\n",nodes[i].addr,nodes[i].num,nodes[i+1].addr);
}
printf("%05d %d %d\n",nodes[i].addr,nodes[i].num,-1);
return 0;
}
2、Golang版本
package main
import (
"fmt"
)
type Nodes struct {
addr int
nextAddr int
num int
}
/**
2019-12-24
1、有一项运行超时
*/
func main() {
head := 0
K := 0
N := 0
var Node Nodes
var NodeList [100000]Nodes // 以空间换时间
var ResList []Nodes
fmt.Scanf("%d %d %d", &head, &N, &K)
for i := 0; i < N; i++ {
fmt.Scanf("%d %d %d", &Node.addr, &Node.num, &Node.nextAddr)
NodeList[Node.addr] = Node
}
// 正常顺序遍历链表,并按顺序将各节点存入ResList切片
Node = NodeList[head]
ResList = append(ResList, Node)
for ; Node.nextAddr != -1; {
ResList = append(ResList, NodeList[Node.nextAddr])
Node = NodeList[Node.nextAddr]
}
N = len(ResList)
// ResList 为正常顺序的单向链,接下来开始逆转链表
if K != 0 {
for j := 0; (N-j)/K != 0 ; j += K {
for i := j; i < (j+j+K)/2; i++ {
ResList[i], ResList[j+j+K-i-1] = ResList[j+j+K-i-1], ResList[i]
}
}
}
for i, v := range ResList {
if i == len(ResList)-1 {
fmt.Printf("%05d %d %d\n", v.addr, v.num, -1)
break
}
fmt.Printf("%05d %d %05d\n", v.addr, v.num, ResList[i+1].addr)
}
}
笔者首先使用的是Golang语言的代码,结果有一项测试没有通过,第五个检查点出现超时。后来用C语言重建算法,结果正确完成,没有出现超时现象。
所以在使用Golang解决算法问题时,尤其需要注意程序运行的运行时间,尽量使用时间复杂度低的算法,在必要的时候,使用空间换时间的打法解决问题。在针对这个问题的时候,才用了这种方法,虽然内存占用量达到了300+KB,最大的测试用例到了3MB,但是顺利完成所有测试。关于Golang版本的代码,希望大家能够提供一些建议,能够缩减运行时间。