【问题标题】:how to print array's even numbers sum/avarage and odd numbers sum/average?如何打印数组偶数和/平均值和奇数和/平均值?
【发布时间】:2019-04-16 01:18:53
【问题描述】:
var a = [32,37,68,66,97,38,16,86,35,58]

我想知道, 如何打印偶数的和&平均,奇数的和&平均

【问题讨论】:

  • 如果您向我们展示您已经尝试过的内容,我们可以帮助您解决问题或为您指明正确的方向。

标签: swift


【解决方案1】:

O(n)

你可以一口气完成:

let (oddsSum, oddsCount, evensSum, evensCount) = a.reduce(into:(0, 0, 0, 0)) { tuple, element in
    if element % 2 != 0 {
        tuple.0 += element
        tuple.1 += 1
    } else {
        tuple.2 += element
        tuple.3 += 1
    }
}

let oddsAverage = oddsCount == 0 ? 0.0 : Double(oddsSum) / Double(oddsCount)
let evensAverage = evensCount == 0 ? 0.0 : Double(evensSum) / Double(evensCount) 

这将产生以下结果:

oddsSum //169
平均赔率 //56.33333333333334
偶数总和 //364
evensAverage //52

两个数组

您可以像这样创建两个奇偶数组:

let a = [32, 37, 68, 66, 97, 38, 16, 86, 35, 58]

let (odds, evens) = a.reduce(into:([Int](), [Int]())) { tuple, element in
    if element % 2 != 0 {
        tuple.0.append(element)
    } else {
        tuple.1.append(element)
    }
}

oddsevens 是两个整数数组:[Int]


总和

计算总和:

let oddsSum = odds.reduce(0, +)           //169
let evensSum = odds.reduce(0, +)          //364

您也可以使用 Accelerate 框架中的 cblas_dasum(_:_:_:),它比 reduce 更快:

import Accelerate

var (odds, evens) = a.reduce(into:([Double](), [Double]())) { tuple, element in
    if element % 2 != 0 {
        tuple.0.append(Double(element))
    } else {
        tuple.1.append(Double(element))
    }
}

var oddSum = Int(cblas_dasum(Int32(odds.count), &odds, 1))
print(oddSum)     //169

var evenSum = Int(cblas_dasum(Int32(evens.count), &evens, 1))
print(evenSum)    //364

平均值

平均值是总和除以每个数组中的元素数。

let oddsAverage = odds.isEmpty ? 0.0 : Double(oddsSum) / Double(odds.count)    //56.33333333333334
let evensAverage = evens.isEmpty ? 0.0 : Double(evensSum) / Double(evens.count) //52

或者您可以使用 Accelerate 框架中的vDSP_meanvD(_:_:_:_:),这比计算总和然后除以计数要快:

import Accelerate

var (odds, evens) = a.reduce(into:([Double](), [Double]())) { tuple, element in
    if element % 2 != 0 {
        tuple.0.append(Double(element))
    } else {
        tuple.1.append(Double(element))
    }
}

var oddAvg = 0.0
vDSP_meanvD(&odds, 1, &oddAvg, vDSP_Length(odds.count))
print(oddAvg)     //56.333333333333336

var evenAvg = 0.0
vDSP_meanvD(&evens, 1, &evenAvg, vDSP_Length(evens.count))
print(evenAvg)    //52.0

【讨论】:

    【解决方案2】:

    添加这样的扩展

    extension Sequence where Self.Element == Int {
        var sum: Int {
            return self.reduce(0, { $0 + $1 })
        }
    }
    

    然后这样做:

    var a = [38,97,25,66,90,31,16,86,33,59]
    var evens = a.filter({ ($0 % 2) == 0 })
    var odds = a.filter({ ($0 % 2) != 0 })
    
    print(evens.sum)
    print(odds.sum)
    

    【讨论】:

    • 发完这篇后,我意识到我可能在做别人的功课。
    • 我喜欢冗长:)
    • 这没有给出平均值。
    • 啊,很抱歉。必须除以计数:)
    • 无论如何,它就像 90% 一样,我很确定这是别人的作业,所以如果你不能从那里拿它并弄清楚如何获得平均值,那么你应该失败.
    【解决方案3】:

    如果没有扩展,那么初学者可能更容易理解,我会这样做:

    let oddElements = a.filter{$0 % 2 == 0}
    let evenElements = a.filter{$0 % 2 != 0}
    
    let oddElementsSum = oddElements.reduce(0, {$0 + $1})
    let oddElementsAverage = oddElementsSum / oddElements.count
    
    let evenElementsSum = evenElements.reduce(0, {$0 + $1})
    let evenElementsAverage = evenElementsSum / evenElements.count
    

    有可能使reduce语句更短一些

    let oddElementsSum = oddElements.reduce(0, {+})
    let evenElementsSum = evenElements.reduce(0, {+})
    

    然后就可以通过打印了

    print (oddElementsSum)
    print (oddElementsAverage)
    print (evenElementsSum)
    print (evenElementsAverage)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      相关资源
      最近更新 更多