【问题标题】:New Year Chaos HackerRank Practise Problem - C# solution optimization [closed]新年 Chaos HackerRank 练习题 - C# 解决方案优化 [关闭]
【发布时间】:2018-11-29 16:05:44
【问题描述】:
static void minimumBribes(int[] q)
{
    Int32 TotalCount = 0;
    bool blnSuccess = true;
    Int32[] size = Ordering(q);
    for (int intI = 0; intI < q.Length; intI++)
    {
        Int32 Tempvariable = 0;
        Int32 TooChaotic = 0;
        Int32 index = Index(size,q[intI]);
        do
        {
            if (q[intI] != size[intI])
            {
                Tempvariable = size[index];
                size[index] = size[index - 1];
                size[index - 1] = Tempvariable;
                index = index - 1;
                TooChaotic = TooChaotic + 1;
                if (TooChaotic > 2)
                {
                    break;
                }
                TotalCount = TotalCount + 1;
            }
        } while (q[intI] != size[intI]);
        if (TooChaotic > 2)
        {
            Console.WriteLine("Too chaotic");
            blnSuccess = false;
            break;
        }
    }
    if (blnSuccess)
    {
        Console.WriteLine(TotalCount);
    }
}

static int[] Ordering(int[] z)
{
    int[] r = new int[z.Length];
    r = z.OrderBy(x => x).ToArray();
    return r;
}
static int Index(int[] z,int integer)
{
    for (int intI = 0; intI < z.Length; intI++)
    {
        if(z[intI]== integer)
        {
            return intI;
        }
    }
    return 0;
}

此代码运行良好,但运行时间太长。 我在 HackerRank 中收到“因超时而终止”。但是,该解决方案在本地计算机上运行良好,但需要更多时间。 问题链接:https://www.hackerrank.com/challenges/new-year-chaos/problem.

示例输入

2(测试用例数)

5(排队人数)

2 1 5 3 4(n 个空格分隔的整数,描述队列的最终状态)

5(排队人数)

2 5 1 3 4(n 个用空格分隔的整数,描述队列的最终状态)。

它必须打印一个整数,表示所需的最低贿赂数量,或者如果线路配置不可行,则太混乱。

输出 3

太乱了

问题:

如何减少它的运行时间?目前,我正在使用数组。

【问题讨论】:

标签: c# .net c#-4.0 visual-studio-2015


【解决方案1】:

几周前我已经解决了,这是我解决问题的方法(100%)

static void minimumBribes(int[] q) {
    int bribe = 0;
    bool chaotic = false;
    int n = q.Length;
    for(int i = 0; i < n; i++)
    {
        if(q[i]-(i+1) > 2)
        {               
            chaotic = true;
            break;     
        }
        for (int j = Math.Max(0, q[i]-2); j < i; j++)
            if (q[j] > q[i]) 
                bribe++;
    }
    if(chaotic)
        Console.WriteLine("Too chaotic");
    else
        Console.WriteLine(bribe);
}

除了挑战提供的方法之外,您不需要任何其他方法

【讨论】:

  • int j = Math.Max(0, q[i]-1-1); 是什么意思?你为什么这样做?
  • @425nesp 以 j 至少 0 开头。避免负索引
  • @425nesp 因为任何大于 q[i] 的数字都不可能到达位置 q[i] - 2,因为只允许两次贿赂。
  • @Gianlucca 请解释一下int j = Math.Max(0, q[i]-1-1这是什么意思。我想出这个解决方案了吗?
  • 行 int j = Math.max(0,q[i]-2) 可以理解如下:当我们是第 i 个索引时,数字 q[i] 最多可以提供 2 次贿赂,因此它最多可以向左移动 2 个位置,因此 q[i]-2 ,但假设我们在索引 0 处,我们不能向左移动超出该位置。因此取两个值的最大值。
猜你喜欢
  • 1970-01-01
  • 2022-04-15
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多