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
}

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

寻找不重复的数字

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

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

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

10个线程,并发加数字

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

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

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

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

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

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

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

司内框架,司内项目

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

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

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

总结

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

posted @ 2022-07-06 11:29  松松哥、  阅读(52)  评论(0)    收藏  举报  来源