Как конвертировать [] int в [2] int? - PullRequest
0 голосов
/ 02 марта 2020

У меня есть функция, которая возвращает [2] int. И у меня есть ломтик ages[len(ages)-2:]. Как я могу преобразовать этот фрагмент в [2] Int.

package main

import (
    "fmt"
    "sort"
)

func TwoOldestAges(ages []int) [2]int {
    sort.Ints(ages)
    return ages[len(ages)-2:]
}

Ответы [ 3 ]

2 голосов
/ 02 марта 2020

Я бы сделал что-то вроде следующего:

func TwoOldestAges(ages []int) (oldest [2]int) {
    sort.Sort(sort.Reverse(sort.IntSlice(ages)))
    copy(oldest[:], ages)
    return
}

Рабочий пример здесь

Я добавил имя к аргументу возврата, так что вы не делаете не нужно указывать, какой размер массива вы делаете в функции. Так как массив ограничен максимальным размером 2, копия просто поместит первые два результата в массив. Поэтому мы сортируем ваш возраст (который сортирует его по возрастанию), а затем переворачиваем его так, чтобы два максимальных результата были первыми двумя ключами.

Теперь, если вы хотите, вы можете обновить размер массива, чтобы он возвращался без необходимости обновите что-нибудь внутри метода.

Редактировать: Я, вероятно, также должен упомянуть, что это также защищает вас от паники из-за ограниченных индексов. Например, если вы прошли только срез с длиной / емкостью 1 , если бы вы полагались на ages[:-2], вы, скорее всего, попали бы за пределы пани c:

pani c: ошибка времени выполнения: границы среза вне диапазона [: 2] с емкостью 1

2 голосов
/ 02 марта 2020

Я новичок в go, я думаю, вы можете создать фиксированный размер массива 2, а затем скопировать первые два значения среза в массив

s := []int{1, 2, 3} 
var twoElements [2]int
//copy the first two values of slice into the entirety of the array
copy(twoElements[:],s[:2]) //copy returns an int of the elements copied

Из go do c:

Встроенная функция копирования копирует элементы из исходного слайса в целевой слайс. (В особом случае он также будет копировать байты из строки в секцию байтов.) Источник и место назначения могут перекрываться. Copy возвращает количество скопированных элементов, которое будет минимальным из len (sr c) и len (dst).

Хорошее чтение, объясняющее встроенную функцию копирования go с несколькими примерами здесь

1 голос
/ 02 марта 2020

Go предназначен для поощрения эффективного кода. Ваш алгоритм из-за сортировки O (n log n). Лучшим алгоритмом будет O (n).

Например, O (n),

package main

import (
    "fmt"
)

func TwoOldestAges(ages []int) [2]int {
    var old [2]int
    for _, age := range ages {
        if old[0] < age {
            old[1] = old[0]
            old[0] = age
        } else if old[1] < age {
            old[1] = age
        }
    }
    return old
}

func main() {
    ages := []int{1, 99, 42, 7, 66, 77}
    fmt.Println(ages)
    oldest := TwoOldestAges(ages)
    fmt.Println(oldest)
    ages = []int{1, 77, 42, 7, 66, 99}
    fmt.Println(ages)
    oldest = TwoOldestAges(ages)
    fmt.Println(oldest)
}

Детская площадка: https://play.golang.org/p/rq4SMS3MRqY

Выход:

[1 99 42 7 66 77]
[99 77]
[1 77 42 7 66 99]
[99 77]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...