我一直在尝试使用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);
}
}
输出示例:
答案 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;