【发布时间】:2016-11-21 08:42:10
【问题描述】:
我在 c# 中进行了黑客等级挑战,试图将我的一些 c 技能带到 c# 中。现在我知道黑客等级由于超时而杀死程序是出了名的愚蠢(在这种情况下,如果它持续超过 3 秒)。但老实说,我想不出进一步优化这段代码的方法。
以下是说明: https://www.hackerrank.com/challenges/ctci-array-left-rotation
基本上,挑战是在数组内向左移动数字数组一些 x 次。
据我所知,这段代码是尽可能少的,并且仍然可以按照他们的要求进行操作。我认为进一步优化此代码的唯一方法是将约束“if(a[i] > 1000000 || a[i]
对我来说,这实际上是将数组移动 x 的最小操作数。但是由于超时,代码在测试用例 7 和 8(共 8 个)中失败。我错过了什么吗?
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
class Solution
{
static void Main(String[] args)
{
int i, j;
int temp = 0;
string[] tokens_n = Console.ReadLine().Split(' ');
int n = Convert.ToInt32(tokens_n[0]);
int k = Convert.ToInt32(tokens_n[1]);
string[] a_temp = Console.ReadLine().Split(' ');
int[] a = Array.ConvertAll(a_temp,Int32.Parse);
//constraints
if(n >= 100000 || n < 1 )
{
System.Environment.Exit(1);
}
if(k > n || n < 1 )
{
System.Environment.Exit(1);
}
for(i = 0; i< n; i++)
{
if(a[i] > 1000000 || a[i] < 1 )
{
System.Environment.Exit(1);
}
}
//double for loop. one adjust position by one. then repeat k number of times.
for(j = 0; j<k; j++)
{
for(i = 0; i< n-1; i++)
{
temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
//view array
for(i = 0; i< n; i++)
{
Console.Write(a[i] + " " );
}
}
}
【问题讨论】:
-
我不想回答这个问题,因为给你做挑战是不公平的,尤其是一个如此简单的挑战。我给你一个提示。您的两个 for 循环在 100000*100000 操作中执行,大约需要 17 分钟。但是你为什么要执行移位呢。你不能告诉哪个元素将移动到第一个位置,哪个到第二个,在 k 移动而不移动 k 次之后?也许你可以输出答案?
-
这是我第一次尝试优化某些东西。我会看看直接输出一些东西。
-
谢谢,现在所有的绿色复选标记。我将原始数组写入具有更新位置的新数组。这不是我想要的方式,因为我认为这不是挑战的目标。但是所有的绿色复选标记都没有减少。
标签: c# optimization timeout