比方說,我有一個數字數組:iOS的 - 在整數數組中選擇第二個最低數
let numbers: [Int] = [1,2,3,4,5,6,7,8]
我想挑選出數組中的第二最低的數字,但我不想使用索引,我知道你可以使用min/maxElement點符號來選擇最低和最高的整數,那麼我如何獲得第二低或第二高的整數?
比方說,我有一個數字數組:iOS的 - 在整數數組中選擇第二個最低數
let numbers: [Int] = [1,2,3,4,5,6,7,8]
我想挑選出數組中的第二最低的數字,但我不想使用索引,我知道你可以使用min/maxElement點符號來選擇最低和最高的整數,那麼我如何獲得第二低或第二高的整數?
直接實現:(如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
根據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]
@vacawama已更新,使其與未排序和重複的元素一起工作。 – Khundragpan
即使OP等於最低值,OP也要求第二低。我會建議回覆你的原始答案,並將其與這一個一起呈現,並解釋它們如何解決一個稍微不同的問題。 – vacawama
(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
是可選的,因爲在殼體的陣列中的所有值都相同,確實沒有「次最低」
得到Maxelement,從數組中刪除它,再次獲取最大元素? –
@BumumitMehta我怎麼會從索引中刪除項目而不知道它會是哪個索引? – FredoFredo
'var numbers = [1,2,3,4,5,6,7,8];讓min = numbers.minElement()!; let index = numbers.indexOf(min)!; numbers.removeAtIndex(索引);讓secondMin = numbers.minElement()!' – vacawama