Go面试编程题目(三)

161 篇文章 12 订阅

原文地址:Go面试编程题目(三)

1、约瑟夫环问题?

题目描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 k 的 士兵会被杀掉出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。

实现代码如下:

package main

import "fmt"

//n个人,每数到k就出圈
func josephus(n int, k int) int {
  if n == 1 {
    return n
  }

  return (josephus(n-1, k)+k-1)%n + 1
}

func main() {
  n := 5
  k := 2
  res := josephus(n, k)
  fmt.Println(res)
}

打印结果如下:

2、给出一串字符,要求统计出里面的字母、数字、空格以及其他字符的个数?

实现代码如下:

package main

import "fmt"

func countUnicode(s string) {
  var letter int //字母个数
  var num int    //数字个数
  var space int  //空格个数
  var other int  //其他个数
  for i := 0; i < len(s); i++ {
    if (s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z') {
      letter++
    } else if s[i] >= '0' && s[i] <= '9' {
      num++
    } else if s[i] == ' ' {
      space++
    } else {
      other++
    }
  }

  fmt.Printf("字母的个数为%d\n", letter)
  fmt.Printf("数字的个数为%d\n", num)
  fmt.Printf("空格的个数为%d\n", space)
  fmt.Printf("其他字符的个数为%d\n", other)
}

func main() {
  s := "A, B, 44...,5 Z、a, b, ..., &&z  "
  countUnicode(s)
}

打印结果如下:

3、编写一个函数就地反转一个整型slice中的元素。

实现代码如下:

package main

import "fmt"

//就地反转一个整型slice中的元素
func reverse(s []int) []int {
  for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
    s[i], s[j] = s[j], s[i]
  }

  return s
}

func main() {
  var s []int = []int{1, 2, 3, 4, 5, 6, 7}
  fmt.Println(reverse(s))
}

打印结果如下:

4、判断两个slice是否拥有相同的元素?

实现代码如下:

package main

import "fmt"

func equal(x, y []string) bool {
  if len(x) != len(y) {
    return false
  }

  for i := range x {
    if x[i] != y[i] {
      return false
    }
  }

  return true
}

func main() {
  x := []string{"a", "b", "c", "d"}
  y := []string{"a", "d", "p", "d"}
  z := []string{"a", "b", "c", "d"}
  fmt.Println(equal(x, z))
  fmt.Println(equal(y, z))
}

打印结果如下:

5、翻转二维数组?

实现代码如下:

package main

import "fmt"

func transpose(a [][]int) [][]int {
  //只有一行则不是二维数组
  if len(a[0]) == 0 {
    return nil
  }
  row := len(a[0]) //arr的row
  col := len(a)    //arr的col
  arr := make([][]int, row, row)
  for i := 0; i <= row-1; i++ {
    arr[i] = make([]int, col)
  }

  for k := col - 1; k >= 0; k-- {
    for y := row - 1; y >= 0; y-- {
      arr[y][k] = a[k][y]

    }

  }

  fmt.Println(arr)
  return arr
}
func main() {
  a := [][]int{
    {0, 1, 2, 3},
    {4, 5, 6, 7},
    {8, 9, 10, 11},
  }

  transpose(a)
}

打印结果如下:

至此,本次分享就结束了,后期会慢慢补充。

以上仅为个人观点,不一定准确,能帮到各位那是最好的。

好啦,到这里本文就结束了,喜欢的话就来个三连击吧。

扫码关注公众号,获取更多优质内容

  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luyaran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值