如何解决数组数计数和除法问题?

时间:2018-10-29 19:34:44

标签: c# arrays .net

我一直在尝试使用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);
    }
}

输出示例:

enter image description here

4 个答案:

答案 0 :(得分:2)

由于这是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);

答案 1 :(得分:1)

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

您的分配被颠倒了。

在要将元素分类到相应数组中的部分中,您以错误的方式分配了项。代替这个:

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];
    }
}

现在,我想我已经了解了您的算法,但是现在我们遇到了一个更大的问题。

这三个数组的大小始终相同,并且等于原始数组中的总项。

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

可能的解决方案:

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

  

更新

现在您已使用Lists解决了此问题,我将为您提供更多建议。即使解决了问题,也应该考虑是否有效地解决了问题。以及如何改进它。 (提示:在这种情况下,使用列表会浪费很多空间)

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

如果您想尝试一下,我将不使用List的解决方法留给您。

https://dotnetfiddle.net/01R09n

希望这会有所帮助!

答案 2 :(得分:0)

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

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

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

我可能建议您按照this post的建议更改List<T>的数组。

干杯!

答案 3 :(得分:0)

每次计算均获得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;