【问题标题】:How to solve an array number count and dividing problem?如何解决数组数的计数和除法问题?
【发布时间】:2018-10-29 19:34:43
【问题描述】:

我一直在尝试使用 C# 和 C# 新手来做一些解决问题的练习。所以这就是问题所在,给定数组 arr= [1,1,0,-1,-1] 有 5 个元素,两个正数,两个负数和一个零位。两个正数的比率为 2/5=0.400000,两个负数的比率为 2/5=0.400000,1 个零的比率为 1/5=0.200000。它应该打印为

0.400000
0.400000
0.200000

我实际上要做的是,计算数组中的所有负数并将其除以该数组中的元素总数。该数组中正数和零的情况相同。最后,它会打印出 3 个结果。这是我尝试过的。我没有得到想要的输出。

using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.Text.RegularExpressions;
using System.Text;
using System;

class Solution {

    // Complete the plusMinus function below.
    static void plusMinus(int[] arr) {
        int[] positiveArray = new int[arr.Length];
        int[] negativeArray = new int[arr.Length];
        int[] zeroArray = new int[arr.Length];

        for(int i=0; i <arr.Length; i++){
            if(arr[i]>0){

                arr[i]=positiveArray[i];

            }else if(arr[i]<0){
                arr[i] = negativeArray[i];
            }else if(arr[i] == 0){
                arr[i] = zeroArray[i];
            }
        }
        float postive = (float)positiveArray.Length/arr.Length;
        float negative = (float)negativeArray.Length/arr.Length;
        float zero = (float)zeroArray.Length/arr.Length;

        Console.WriteLine(postive);
        Console.WriteLine(negative);
        Console.WriteLine(zero);

    }

    static void Main(string[] args) {
        int n = Convert.ToInt32(Console.ReadLine());

        int[] arr = Array.ConvertAll(Console.ReadLine().Split(' '), arrTemp => Convert.ToInt32(arrTemp))
        ;
        plusMinus(arr);
    }
}

输出示例:

【问题讨论】:

  • 您能否添加一个包含一些输入和输出的示例?
  • 当然。感谢您提醒我添加输出示例

标签: c# arrays .net


【解决方案1】:

因为这是 c#,所以你可以使用一些花哨的 LINQ

Console.WriteLine((float)arr.Count(n => n  > 0)/(float)arr.Length);
Console.WriteLine((float)arr.Count(n => n  < 0)/(float)arr.Length);
Console.WriteLine((float)arr.Count(n => n == 0)/(float)arr.Length);

【讨论】:

    【解决方案2】:

    这里有几个问题。让我看看我是否可以帮助您决定如何解决它们。

    你的作业被颠倒了。

    在您想要将元素分类到相应数组的部分中,您以错误的方式分配项目。而不是这个:

    for(int i=0; i <arr.Length; i++){
        if(arr[i]>0){
            arr[i]=positiveArray[i];
        }else if(arr[i]<0){
            arr[i] = negativeArray[i];
        }else if(arr[i] == 0){
            arr[i] = zeroArray[i];
        }
    }
    

    试试这个:

    for(int i=0; i <arr.Length; i++){
        if(arr[i]>0){
            positiveArray[i] = arr[i];
        }else if(arr[i]<0){
            negativeArray[i] = arr[i];
        }else if(arr[i] == 0){
            zeroArray[i] = arr[i];
        }
    }
    

    现在,我想我明白你的算法了,但现在我们遇到了一个更大的问题。

    3个数组的大小始终相同,等于原始数组中的项目总数。

    这就是问题所在。在开始计数循环之前,您将创建数组,您将根据项目的类别(正数、负数、零)在其中保存项目,但问题是在 C# 中,我们必须事先保留要使用的数组的大小和所以你总是将原始数组的长度分配给每个创建的数组。因此,您所有的数组都具有相同的大小,因此您总是得到 1 作为结果。

    可能的解决方案:

    提示 1:对于这类问题,您不需要实际存储数组值,只需计算它们。所以解决这个问题的一种可能方法是创建计数器而不是数组,每次递增适当的计数器,然后使用这些计数器来计算最终结果。

    更新

    既然你使用Lists 解决了这个问题,我会给你一些建议。即使你解决了问题,你也应该考虑你是否有效地解决了它。你怎么能改进它。 (提示:在这种情况下使用列表会浪费大量空间)

    我建议您阅读有关运行时/空间算法分析的更多信息。它将教你如何编写更好的代码。那里有很多可用的材料。这是我刚刚通过 Google 快速搜索找到的:https://www.cs.cmu.edu/~adamchik/15-121/lectures/Algorithmic%20Complexity/complexity.html

    我会给你一个不使用List 的可能解决方案,以防你想尝试一下。

    https://dotnetfiddle.net/01R09n

    希望这会有所帮助!

    【讨论】:

    • 非常感谢您指出我的错误。这次它使用 List
    • 不客气!对这个问题使用列表并不是最好的解决方案。我强烈建议您使用计数器来解决这个问题。我会更新答案以提供更多详细信息。
    【解决方案3】:

    好的,现在通过示例我可以假设您的问题是您已经在此行上指定了数组长度:

        int[] positiveArray = new int[arr.Length];
        int[] negativeArray = new int[arr.Length];
        int[] zeroArray = new int[arr.Length];
    

    因此,当您进行除法时,您总是得到 1,因为所有数组的长度都与原始数组的长度相同。一种解决方案是删除数组长度的初始化,但如果这样做,在插入正、负和零数组时会遇到另一个问题,您必须通过更改插入它们的方式来修复它。

    我可能会建议您按照this post 的建议更改List&lt;T&gt; 的数组。

    干杯!

    【讨论】:

    • 非常感谢。列表是解决方案。
    【解决方案4】:

    每次计算得到 1 的原因是你除以相同的数字,new int[arr.Length] 的长度与arr.Length 的长度相同。

    但是,您可以计算不同数字的出现次数,例如:

    var positiveCount = 0;
    // with the negative numbers and zeros also
    
    for(int i=0; i <arr.Length; i++){
        if(arr[i]>0){
            positiveCount++;
        }
        // and so on...
    }
    
    //then divide with the length:
    var positive = (float)positiveCount/arr.Length;
    

    【讨论】:

    • 这对我来说真的很短,也可以节省很多时间。谢谢先生。
    猜你喜欢
    • 2021-01-20
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2011-03-13
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多