在Go中读取一行空格分隔整数的简洁而强大的方法

时间:2016-05-28 11:29:55

标签: arrays parsing go

我一直在尝试HackerRank,其中问题通常需要将整数行读入数组(切片)。

对于许多问题,我的解析代码最终比解决方案的算法更大。例如,Sherlock and Array

就是这种情况

关于如何简洁地将空格分隔的整数行解析成切片的任何想法? fmt.Scanf不支持切片,使用bufio时,我会得到很长的解决方案。

一些要求:

  • 您只能使用标准库。
  • 解决方案应该简洁,越短越好。
  • 不应跳过错误检查。我知道HackerRank中的输入很明确,你应该能够偷工减料,但请不要这样做,这是不好的做法。
  • 应该合理有效。

注意: 解析器应该只使用一行而不是完整的输入。

6 个答案:

答案 0 :(得分:4)

嗯,我也遇到了一些黑客问题,这就是我提出的问题。通常,问题始于数组中的项目数:

func main() {
    var N int
    fmt.Scanf("%d", &N)
    line := make([]int, N)
    for i, _ := range line {
        fmt.Scanf("%d", &line[i])
    }

    // Do something with the values
}

答案 1 :(得分:2)

您可以使用fmt.Scanf,但需要跟踪您获得的值。

// a.go
package main

import (
    "fmt"
    "io"
)

func main() {
    var (
        next int
        nums []int
    )

    for {
        n, err := fmt.Scanf("%d", &next)
        if err == io.EOF {
            break
        }
        if err != nil {
            panic(err)
        }
        if n == 0 {
            break
        }

        nums = append(nums, next)
    }

    fmt.Printf("%#v\n", nums)
}
$ echo "4 8 15 16 23 42" | go run a.go
[]int{4, 8, 15, 16, 23, 42}

答案 2 :(得分:1)

1)读取字符串

2)在[前加上]

3)将json解析为[] int?

var input = "1,2,3"
var answer []int
j := []byte(fmt.Sprintf("[%s]",input))
err:= json.Unmarshal(j, &input)
if err != nil {
  panic(err)
}
for k,v := range input {
   fmt.Printf("Element №%v is %v\n", k,v)
}

也使用拆分字符串(https://godoc.org/strings#Split) 和https://godoc.org/strconv#ParseInt

input:= "1,2,3"
temp := strings.Split(input, ",")
var answer []int

for _,v := range temp {
  i,err := strconv.ParseInt(v)
  if err != nill {
     panic(err)
  }
  answer = append(answer, i)
}

UPD:刚发现这些数字是SPACE分开的。 所以,这段代码必须做的事情:

input:= "1 2 3"
temp := strings.Split(input, " ")
var answer []int

for _,v := range temp {
  i,err := strconv.ParseInt(v)
  if err != nill {
     panic(err)
  }
  answer = append(answer, i)
}

答案 3 :(得分:1)

$(".linksrtitle").click(function(){
   $(this).next(".linksrwrap").slideToggle();  // doesn't work
});

答案 4 :(得分:0)

我曾经在 hackerrank 中使用过这个(很简洁,但没有针对人类进行测试):

func scanInt(n int) []int {
    input := make([]int, n)
    buffer := make([]interface{}, n)

    for i := 0; i < n; i++ {
        buffer[i] = &input[i]
    }

    fmt.Scanln(buffer...)

    return input
}

答案 5 :(得分:0)

func main(){

LOGOUT_REQUEST

}