最近刚刚结束一个后端的笔试,里面有两道编程题,都不算很难。但是苦于答题语言只给了Java,而自己已经很久不写Java而且也不用Java刷题,所以只写了出了第一道。所以现在用Go重新来做一下这两道编程题
越是看起来简单的事情,越是要动手做起来
编程题1
给定两个数组,一个数组代表一个N进制数,数组的上每一位N进制数用10进制表示。例如
//16进制数6a7e表示为数组arra
arra := []int{6, 10, 7,14}
//16进制数3bcd表示为数组arrb
arrb := []int{3, 11, 12,13}
//他们的和为
result:=[]int{10, 6 ,4 ,11}
思路很简单,首先先将两个数组反转过来,然后对两个数组的每一位进行求和存进结果数组,如果这一位的和大于N就取余,然后在下一位加1。最后循环完两个数组后对结果再进行一次反转。
func addRadixArray(a, b []int, redix int) []int {
result := make([]int, len(a)+1)
revere(a)
revere(b)
for i := 0; i < len(a) || i < len(b); i++ {
if i < len(a) {
result[i] += a[i]
}
if i < len(b) {
result[i] += b[i]
}
if result[i]/redix != 0 {
result[i+1] = result[i] / redix
result[i] %= redix
}
}
//fmt.Println(result)
revere(result)
return result
}
func revere(arr []int) []int {
for i := 0; i < len(arr)/2; i++ {
j := len(arr) - 1 - i
//k := arr[i]
//arr[i] = arr[j]
//arr[j] = k
//多重赋值语句,下面等于上面3行的两数交换语句
arr[i], arr[j] = arr[j], arr[i]
}
return arr
}
func main() {
arra := []int{6, 10, 7, 14}
arrb := []int{3, 11, 12, 13}
redix := 16
fmt.Println("第一个数", arra)
fmt.Println("第二个数", arrb)
sumArray := addRadixArray(arra, arrb, redix)
fmt.Println(redix, "进制下的和为", sumArray)
}
代码也很简单,不过Go中没有数组翻转的函数,在写反转函数时又了解到Go的一个多重赋值语句的使用arr[i], arr[j] = arr[j], arr[i],就相当于arr[i]和arr[j]进行交换,不需要使用一个中间变量来进行两数交换。
编程题2
题目对于任意输入的一段文本,需要判断该文本是否包含了至少2个行业词库中的词。 请实现一个方法来满足该需求。注意: 1.匹配时忽略字母大小写; 2.相同的词出现多次也只算1个. 3.尽可能考虑执行高效。
行业词库词汇示例:[nodejs] [微服务] [定时任务] [JavaScript] [浏览器] [并发] [Rabbit] [MQ] [数据库] [MySQL]
测试用例: "MySQL是世界上最流行的开源数据库”,返回 true
思路将这些词语用map存起来,接着遍历这个map,用strings.Contains(text,term)函数来判断text文本中是否含有term这些热门词汇,如果有计数器加1,当计数器大于等于2时就返回true。
func containsIndustryTerms(text string, industryTerms map[string]bool) bool {
text = strings.ToLower(text)
fmt.Println(text)
count := 0
for term := range industryTerms {
if strings.Contains(text, strings.ToLower(term)) {
fmt.Println(term)
count++
}
if count >= 2 {
return true
}
}
return count >= 2
}
func main() {
text := "Mysql是世界上最流行的开源数据库"
industryTerms := map[string]bool{
"nodejs": true,
"微服务": true,
"定时任务": true,
"JavaScript": true,
"浏览器": true,
"并发": true,
"Rabbit MQ": true,
"数据库": true,
"MySQL": true,
}
fmt.Println(text, "是否包含两个行业词库中的词", containsIndustryTerms(text, industryTerms))
}
这个其实也不难,主要是当时时间快没了,然后答题编辑器给出的代码很乱,然后语法又不是记得很清楚,最后就懒得做了。现在来说就是一个后悔,主要原因还是自己基础不够扎实,要开始复习一下算法题了。