Golang面试中的一些常见的算法题

722 阅读1分钟

50金币的问题

/*
你有50枚金币,需要分配给以下几个人:Matthew,Sarah,Augustus,Heidi,Emilie,Peter,Giana,Adriano,Aaron,Elizabeth。  
分配规则如下:  
a. 名字中每包含1个'e'或'E'分1枚金币  
b. 名字中每包含1个'i'或'I'分2枚金币  
c. 名字中每包含1个'o'或'O'分3枚金币  
d: 名字中每包含1个'u'或'U'分4枚金币  
写一个程序,计算每个用户分到多少金币,以及最后剩余多少金币?  
程序结构如下,请实现 ‘dispatchCoin’ 函数
*/

var (
	coins = 50
	users = []string{
		"Matthew", "Sarah", "Augustus", "Heidi", "Emilie", "Peter", "Giana", "Adriano", "Aaron", "Elizabeth",
	}
	distribution = make(map[string]int, len(users))
)
 
func main() {
	left := dispatchCoin()
	fmt.Println("剩下:", left)
}


func dispatchCoin(arr []string) int {
   for _, v := range arr {
      fmt.Println(v)
      for i := 0; i < len(v); i++ {
         if v[i] == 'e' || v[i] == 'E' {
            distribution[v] += 1
         } else if v[i] == 'i' || v[i] == 'I' {
            distribution[v] += 2

         } else if v[i] == 'o' || v[i] == 'O' {
            distribution[v] += 3
         } else if v[i] == 'u' || v[i] == 'U' {
            distribution[v] += 4
         }
      }
      coins -= distribution[v]
      fmt.Printf("分得:%d\n", distribution[v])
   }
   return coins
}

递归相关的面试题

  1. 计算斐波那契数列的第n项。

斐波那契数列是一个递归定义的数列,其中每个数字是前两个数字的和。例如,前几个数字是0、1、1、2、3、5、8、13、21等等。求第n项的值可以使用递归来解决。以下是一个示例代码:

goCopy code
func fibonacci(n int) int {
    if n == 0 {
        return 0
    } else if n == 1 {
        return 1
    } else {
        return fibonacci(n-1) + fibonacci(n-2)
    }
}
  1. 遍历二叉树

递归可以用于遍历二叉树,其中包括前序遍历、中序遍历和后序遍历。以下是一个示例代码:

goCopy code
type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *TreeNode
}

func preorderTraversal(root *TreeNode) []int {
    if root == nil {
        return []int{}
    }
    res := []int{root.Val}
    res = append(res, preorderTraversal(root.Left)...)
    res = append(res, preorderTraversal(root.Right)...)
    return res
}
  1. 反转字符串

反转字符串可以使用递归来解决。基本思路是将第一个字符和最后一个字符交换,然后对除去这两个字符的子串进行递归。以下是一个示例代码:

goCopy code
func reverseString(s []byte) {
    reverseHelper(s, 0, len(s)-1)
}

func reverseHelper(s []byte, start, end int) {
    if start >= end {
        return
    }
    s[start], s[end] = s[end], s[start]
    reverseHelper(s, start+1, end-1)
}

这些都是递归常见的面试题,但在实际面试中,可能会有更具体的问题。因此,建议您熟练掌握递归的基本思想,并尝试解决更多不同类型的递归问题。