• 2022-07-05 QQ音乐面试记录及复盘


    2022-07-05 QQ音乐面试记录及复盘

    考试成绩排序

    题目给定考生名称、数学成绩、语文成绩,要求总分高的排前面,总分一样数学成绩优先,数学成绩一样语文成绩优先,都一样情况下,按考生名称排序。注:不能使用排序库函数

    过程:我一看,这不简单,不就是基本的排序算法吗,快速排序和冒泡排序。题挺简单,但我一时间没想起来怎么写。终于回想起了冒泡排序的算法,后面在排序条件上踩了一个坑,耽误了点时间,最后还是在要求时间内写出来了。

    package main
    
    import (
    	"fmt"
    )
    
    //假设学生有两门课程语文和数学,如:XiaoMing(80, 90),
    //实现一个班级名次排名,要求总分高的排在前面,当总分相同时,
    //数学成绩高的在前面,若两门课程均相同时,按姓名拼音排序,
    
     type student struct {
     	Name string
     	Math int
     	Chinese int
     }
    func main() {
    	studentList := []*student{
    		{
    			Name: "A1",
    			Math: 90,
    			Chinese: 85,
    		},
    		{
    			Name: "A2",
    			Math: 94,
    			Chinese: 105,
    		},
    		{
    			Name: "A3",
    			Math: 95,
    			Chinese: 80,
    		},
    		{
    			Name: "A4",
    			Math: 95,
    			Chinese: 80,
    		},{
    			Name: "A5",
    			Math: 93,
    			Chinese: 106,
    		},
    	}
    	rank(studentList)
    	for i:= range studentList{
    		fmt.Println(studentList[i])
    	}
    }
    
    func rank(s []*student){
    	for i:= range s{
    		for j:=0;j<len(s);j++{
    			if compare(s[i],s[j]){
    				s[i], s[j]=s[j],s[i]
    			}
    		}
    	}
    }
    func compare(s1, s2 *student)bool{
    	if s1.Chinese+s1.Math > s2.Chinese+s2.Math{
    		return true
    	} else if  s1.Chinese+s1.Math < s2.Chinese+s2.Math{
    		return false
    	}
    	if s1.Math > s2.Math {
    		return true
    	} else if s1.Math < s2.Math{
    		return false
    	}
    	if s1.Chinese > s2.Chinese{
    		return true
    	} else if s1.Chinese < s2.Chinese{
    		return false
    	}
    	return s1.Name < s2.Name
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    反思:对基础知识掌握的不够好,这种基础算法应该要分分钟写出来才正常

    寻找不重复的数字

    题目一个长度为10的数组,每个元素的大小在0-9之间,但是只有一个数字是不重复的,请找出那个数字

    过程:我有点懵,平常刷算法题一般是用个map直接记录就行了,这多简单。但是面试官肯定是不希望看到这么简单的,问我有没有其他方式,我想了好久确实没啥思路,心里想了好几种方案都解不出来,直接放弃了。

    反思:面试完我搜了一下,大概率是这个题的变种:只出现一次的数字,要用到位运算和电路等知识,这块确实不容易想到,还需要多看看题的多种解法,不能只求通过。

    10个线程,并发加数字

    问题10个线程,并发加数字,每个线程加100万,最后的结果是1000万吗

    过程: 这有并发的情况,肯定不是一千万啊。然后问题来了,那有什么办法可以让它稳定一千万呢?
    问得好啊,第一种方式是加锁啊,缺点就是性能损耗太大,每个线程100万次,每次都要判断锁,性能会很差。那有没有其他损耗没那么大的方法呢?我回答的是用atomic库的原子函数或者用Redis的Incr来加。回答完感觉都不是面试官想要的答案。

    反思:其实我后来想了想,还有一种方式是使用通道,10个线程往通道里面发送数据,由通道的接收方去做增加操作,但是这样10个线程实际上可能等价于1个,完全体现不出多线程的优势,我也挺头秃的。。。

    分布式事务,先扣钱,后发奖励

    问题你要开发一个系统,先调用账户系统扣钱,后调用业务业务发奖励,怎么做,会遇到什么异常情况?

    过程:这就是分布式事务嘛,可惜不太了解。异常情况我问答的是:1、扣钱失败了;2、扣钱成功,发奖励失败了;3、整体链路超时了。回答了问我还有没其他情况?我:???。这还有啥其他情况,画个流程图出来也就这几种异常啊,当时没太明白。

    反思: 下来搜了下,西巴,可以参考这个:分布式事务,哦,原来还有回滚操作,回滚也会失败,西巴。

    司内框架,司内项目

    问题估计是看我上面几个问题回答的不行,转而问起了平常工作中用的开发框架和项目经历

    过程: 这个没啥好说的,框架大致了解过一些,遗憾的是当时没想起来画个架构图讲解啥的,只靠嘴在那里巴拉巴拉,感觉说不太清楚。

    反思:有条件的情况就画个架构图辅助一下

    总结

    感觉表现很差,大概率是没了,还是要多刷刷题多看下分布式的知识,之前复习的网络知识和golang高级知识一个都没问到啊。。。。

  • 相关阅读:
    Spring注解解析 | P/C命名空间
    Java锁小记
    什么是特洛伊木马,它能造成什么损害?
    【Git】:远程仓库操作
    穿越障碍:最小路径和的高效算法比较【python力扣题64】
    网站被DDOS攻击怎么办?防护经验!
    纸浆暴力反弹——复制去年走势,铁矿石认购2-4倍,双硅价差再度翘尾?2022.6.28
    Redis性能滑坡:哈希表碰撞的不速之客【redis第二部分】
    通过索引名(行、列名)提取DataFrame中的数据loc()通过索引号(行、列号)提取DataFrame中的数据iloc()
    泰山OFFICE技术讲座:JDK字体支持编码的研究1
  • 原文地址:https://blog.csdn.net/mythest/article/details/125628170