一次简单的面试题总结

145 阅读2分钟

最近刚刚结束一个后端的笔试,里面有两道编程题,都不算很难。但是苦于答题语言只给了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))
}

这个其实也不难,主要是当时时间快没了,然后答题编辑器给出的代码很乱,然后语法又不是记得很清楚,最后就懒得做了。现在来说就是一个后悔,主要原因还是自己基础不够扎实,要开始复习一下算法题了。