2016-08-14 34 views
1

比方說,我有一個數字數組:iOS的 - 在整數數組中選擇第二個最低數

let numbers: [Int] = [1,2,3,4,5,6,7,8] 

我想挑選出數組中的第二最低的數字,但我不想使用索引,我知道你可以使用min/maxElement點符號來選擇最低和最高的整數,那麼我如何獲得第二低或第二高的整數?

+5

得到Maxelement,從數組中刪除它,再次獲取最大元素? –

+0

@BumumitMehta我怎麼會從索引中刪除項目而不知道它會是哪個索引? – FredoFredo

+0

'var numbers = [1,2,3,4,5,6,7,8];讓min = numbers.minElement()!; let index = numbers.indexOf(min)!; numbers.removeAtIndex(索引);讓secondMin = numbers.minElement()!' – vacawama

回答

0

直接實現:(如Sulthan建議?)

func secondMax(numbers: [Int]) -> Int { 
    let (_, second) = numbers.reduce((Int.min, Int.min)) {(max2: (first: Int, second: Int), value: Int) in 
     if value > max2.first { 
      return (value, max2.first) 
     } else if value > max2.second { 
      return (max2.first, value) 
     } else { 
      return max2 
     } 
    } 
    return second 
} 
print(secondMax([1,2,3,4,5,6,7,8])) //->7 
print(secondMax([1,1,2,3,4,4])) //->4 
print(secondMax([5,5,6,1,2,3,4])) //->5 
print(secondMax([5,6,6,1,2,3,4])) //->6 
1

根據OP評論,第二最大值,最小值將是數組的最大值和最小值,以防冗餘。我已經更新了這個方法。

var numbers: [Int] = [1,1,2,3,4,4] // or [1,2,3,4,5,6,7,8] 
let maxCount = numbers.filter({$0 == numbers.max()}).count 
let minCount = numbers.filter({$0 == numbers.min()}).count 

let secondHighest = numbers.filter(){ 
    maxCount > 1 ? $0 == numbers.max() : $0 < numbers.max() 
}.last 
// prints 4 for [1,1,2,3,4,4] and 7 for [1,2,3,4,5,6,7,8] 

let secondLowest = numbers.filter(){ 
    minCount > 1 ? $0 == numbers.min() : $0 > numbers.min() 
}.first 
// prints 1 for [1,1,2,3,4,4] and 2 for [1,2,3,4,5,6,7,8] 
+0

@vacawama已更新,使其與未排序和重複的元素一起工作。 – Khundragpan

+0

即使OP等於最低值,OP也要求第二低。我會建議回覆你的原始答案,並將其與這一個一起呈現,並解釋它們如何解決一個稍微不同的問題。 – vacawama

0

(1)找到最低值; (2)刪除該值; (3)找到分鐘剩餘的:

let numbers: [Int] = [1,2,3,4,5,6,7,8] 

var lowest = numbers.minElement()! 
var secondLowest = numbers.filter { $0 > lowest }.minElement() 

secondLowest是可選的,因爲在殼體的陣列中的所有值都相同,確實沒有「次最低」

相關問題