面试题目 - Go语言中文社区

面试题目


  1. 请撸一个二叉树
package main

import "fmt"

func main() {
  fmt.Println("Hello World")
}

// 实现下面这个翻转二叉树的函数
// 要达到的效果是这样
// 翻转之前:
//        1
//      /  
//     /     
//    2       3
//   /      / 
//  4   5   6   7
// 翻转之后:
//        1
//      /  
//     /     
//    3       2
//   /      / 
//  7   6   5   4
// 给定的二叉树不一定是满的

type TreeNode struct {
  Value interface{}
  Left *TreeNode
  Right *TreeNode
}

func InvertBinaryTree(root *TreeNode) {
  // write your code here
}
  1. 下面是一个计算 Fibonacci 数列 数列第 N 项的函数,
    请简述它的时间复杂度,并用你熟悉的语言写出一个优化的版本,简述优化前后的原理和优化的复杂度(所有编程题目请确保你的代码能正常运行并输出结果,下同)
function fibonacci(n) {
    if (n === 0 || n === 1) {
        return n;
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}
class Fibonacci {
    public static int fibonacci(int n) {
        if (n == 0 || n == 1) {
            return n;
        } else {
            return fibonacci(n - 1) + fibonacci(n - 2);
        }
    }
}

3.用你熟悉的语言写一个程序,找出数组中差值为 k 的 数共有几对

示例:

差值 k=4,数组是 [7, 6, 23,19,10,11, 9, 3, 15]
结果是 (7,11) (7,3) (6,10) (19,23) (15,19) (15,11) 共6对

function countPairsWithDifference(arr, k) {
    // 实现
}

countPairsWithDifference([7, 6, 23,19,10,11, 9, 3, 15], 4)
// 返回 6
class Main {
    public static int countPairsWithDifference(int[] arr, int k) {
        // 实现
    }

    public static void main (String[] args) throws java.lang.Exception {
        int[] arr = {7, 6, 23,19,10,11, 9, 3, 15};
        // 返回 6
        countPairsWithDifference(arr, 4);
     }
}

4.HTTP GET 和 POST 方法有什么区别?谈谈你对 RESTful 的理解

5.- 请写出一个 git 命令,撤销前一个提交

  • 请问 fork 一个 git 仓库后,如何跟上游同步

  • 如果代码分支像下面这样:

                         A---B---C topic
                        /
                 D---E---F---G master
    

    请画出git rebase master topic 命令后的结果

  • 你用过 git rebase -i 参数吗?使用git rebase -i后哪一个命令可以达到squash的效果

6.假设货币有 1,5,10 三种面额,写一个函数,输出所有总和为 N 的货币的组合;

例如,额度是 12,有如下几种方案:

  • (1, 1, 10)
  • (1, 1, 5, 5)
  • (1, 1, 1, 1, 1, 1, 1, 5)
  • 12 个 1
  1. 假设一个场景,比如淘宝,用户加入购物车行为记录是用什么方式保存,尝试不同的方式,阐述各自方案的利弊

  2. 以下代码有什么问题,说明原因。

type student struct {
    Name string
    Age  int
}

func pase_student() {
    m := make(map[string]*student)
    stus := []student{
        {Name: "zhou", Age: 24},
        {Name: "li", Age: 23},
        {Name: "wang", Age: 22},
    }
    for _, stu := range stus {
        m[stu.Name] = &stu
    }

}

考点:foreach
解答:
这样的写法初学者经常会遇到的,很危险! 与Java的foreach一样,都是使用副本的方式。所以m[stu.Name]=&stu实际上一致指向同一个指针, 最终该指针的值为遍历的最后一个struct的值拷贝。 就像想修改切片元素的属性:

func main() {
    runtime.GOMAXPROCS(1)
    wg := sync.WaitGroup{}
    wg.Add(20)
    for i := 0; i < 10; i++ {
        go func() {
            fmt.Println("A: ", i)
            wg.Done()
        }()
    }
    for i := 0; i < 10; i++ {
        go func(i int) {
            fmt.Println("B: ", i)
            wg.Done()
        }(i)
    }
    wg.Wait()
}

考点:go执行的随机性和闭包
解答:
谁也不知道执行后打印的顺序是什么样的,所以只能说是随机数字。 但是A:均为输出10,B:从0~9输出(顺序不定)。 第一个go func中i是外部for的一个变量,地址不变化。遍历完成后,最终i=10。 故go func执行时,i的值始终是10。

第二个go func中i是函数参数,与外部for中的i完全是两个变量。 尾部(i)将发生值拷贝,go func内部指向值拷贝地址。

  1. 主协程如何等其余协程完再操作
  2. map如何实现顺序读取
  3. 实现消息队列(多生产者,多消费者)(基于slice加锁可以实现)
  4. 数据库如何建索引,讲述建立索引的策略
  5. 死锁条件,如何避免
  6. 讲解一下单点登录的思路、方案
    17, cookie 和 session 区别和应用
  7. 会计算算法的复杂度吗?哪些常见的算法是稳定的
  8. golang 踩过哪些坑?在其他语言是否有同样的缺陷,做一个对比
  9. 了解redis吗,讲解一下你们是如何应用的
  10. 了解rpc和grpc吗?稍微讲解一下应用的业务场景和解决的问题
  11. 为什么选择golang?除了beego还使用过其他框架吗?差别在哪里
  12. 有一个场景,网站会统计每日用户的活跃度做一个累计的评分,每天凌晨
    12:00 系统会清楚所有当天活跃数据。如何保证前端用户看到的是正确的
    显示而不会是昨天的数据(考虑用户量庞大,后台清除数据需要消耗一定
    的时间)
  13. 熟悉linux的运维吗?常用的网络状态、内存、CPU、进程相关的指令
  14. 如何部署服务系统的,如何构建到发布
  15. 阐述一下常用的数据库,有什么优化的策略
  16. 用channel实现一个定时器
  17. 退出channel时如何保证chan消费完
  18. channel 缓冲和无缓冲的区别
  19. golang标准库的sync包了解吗?都提供了些什么功能
  20. 用go语言实现堆和栈,讲述一下思路即可
  21. golang能否实现 继承、重载、多态功能,讲解一下interface
  22. 关于设计模式,观察者模式、生产消费者模式,有思考过使用的场景吗
版权声明:本文来源简书,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.jianshu.com/p/7b2f37b05ac6
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-01-12 12:01:14
  • 阅读 ( 1387 )
  • 分类:面试题

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢