Skip to content

Instantly share code, notes, and snippets.

@nerg4l
Created November 14, 2019 16:43
Show Gist options
  • Save nerg4l/c8d2cb476d22430a64dfd68c20b1670e to your computer and use it in GitHub Desktop.
Save nerg4l/c8d2cb476d22430a64dfd68c20b1670e to your computer and use it in GitHub Desktop.
exercism - Flatten Array
package flatten
// BenchmarkFlatten-8 244364 4568 ns/op 3232 B/op 80 allocs/op
func Flatten(nested interface{}) []interface{} {
flattened := []interface{}{}
switch x := nested.(type) {
case []interface{}:
for _, v := range x {
flattened = append(flattened, Flatten(v)...)
}
default:
if x != nil {
flattened = append(flattened, x)
}
}
return flattened
}
package flatten
// BenchmarkFlatten-8 340998 3304 ns/op 3248 B/op 43 allocs/op
func Flatten(nested interface{}) []interface{} {
flattened := []interface{}{}
var v interface{}
array := nested.([]interface{})
for 0 < len(array) {
v, array = array[0], array[1:]
switch x := v.(type) {
case []interface{}:
array = append(x, array...)
continue
case interface{}:
flattened = append(flattened, v)
}
}
return flattened
}
package flatten
type arrayStackItem struct {
index int
array []interface{}
}
// BenchmarkFlatten-8 486426 2328 ns/op 2256 B/op 33 allocs/op
func Flatten(nested interface{}) []interface{} {
stack := []arrayStackItem{}
flattened := []interface{}{}
i, array := 0, nested.([]interface{})
for {
if i >= len(array) {
if len(stack) > 0 {
var item arrayStackItem
item, stack = stack[len(stack)-1], stack[:len(stack)-1]
i, array = item.index, item.array
continue
}
if i >= len(array) {
break
}
}
v := array[i]
i++
switch x := v.(type) {
case []interface{}:
stack = append(stack, arrayStackItem{i, array})
i, array = 0, x
continue
case interface{}:
flattened = append(flattened, x)
}
}
return flattened
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment