矩阵元素地址计算

填空题第一题,给定形状的一个矩阵,下标是从一开始,每个元素占用两个存储,地址从10000开始,问给定坐标在内存中的地址。

这题考细节,结果差不多在17000+那个位置,然后就是考虑,如果下标从一开始,那么扣除我们习惯性思维从零开始的下标,需要把计算的坐标[x,y]分别减去一,获取到实际坐标,而给的那个矩阵形状也是需要减去一,最后就是先行后列还是先列后行,这一点题目有明确说明。

二叉树有770个节点,多少叶子,深度多少。

借用一下Wiki上面二叉树的图片:

二叉树我没接触过,不会懂,不做解释。

网络延迟

填空题第三题,服务器宽带128MB/s(是MB不是Mbps),单向延迟50ms,磁盘写入速度是100MB/s,现在有1000个客户端同时向服务器发送64kb的数据,那么响应时间(这边是来回)是多少。

这一题考点不是很清楚,如果不考虑其他性能问题,磁盘和宽带都是够的,延迟就是100ms。

简答题,多设置索引就可以提高数据查询速度吗,为什么。

答案肯定是否定的,我记得貌似之前网易52G的那个裤子,还是其他裤子我忘记了,工具提供了一个shell脚本,社工库提前按照邮箱用户名排序,保存到文件自/名字.txt这样的格式,查询的时候使用这个shell,可以在几秒内从几十个G的数据中找到需要的数据,会查看用户名首部几个字母,打开对应文件夹的文件,只需要读取部分文件,这就是索引,提前提取数据特征按照一定规则保存着,对比要查询的数据。数据库肯定不能每次写入的时候都从新排序所有数据,所以会另取一个区域保存着数据的地址和特征,这样做就是牺牲写入速度换取读取速度,同时会占用更多的空间,大多数情况下索引是能提高读取速度,少数情况下索引不能提高查询效率,就是数据特征并不明显情况下,比如性别,最多就是A/B/C/D四种情况,相应的创建索引也不能达到快速查找的目的。

程序题

说实在的,除非现场用电脑调试,不然是没办法写出代码来的,那天在纸上歪歪扭扭的写了几个符号,太累了,写字不怎么好看,写代码就更别说了,那时候看了后面几个同学非常认证的做着试卷

最大子集问题

给定一个数组,求最带子集,数组元素不超过20个,不限语言 ,并且按照从大到小排序。下面是我用go编写的,编辑器调试几次就出结果了,手写太为难面试的人了,主要问题是得运行一遍才知道结果,题目也可能网上查询来的题目,只不过现场变成笔试。

[[789 456 123] [789 123] [789 456] [456 123] [123] [456] [789]]
package main  
  
import "fmt"  
  
func main() {  
   fmt.Println(MaxSubset([]int{123, 456, 789}))  
}  
  
func MaxSubset(array []int) ([][]int) {  
   // 第一步排序 没啥好说的  
  for range array{  
      for i := range array {  
         if i == len(array)-1 {  
            break  
  }  
         if array[i] < array[i+1] {  
            array[i], array[i+1] = array[i+1], array[i]  
         }  
      }  
   }  
   return maxSubset(array)  
}  
  
func maxSubset(array []int) ([][]int) {  
   if len(array) == 1 {  
      return [][]int{array}  
   }  
   // 分为包括当前元素 和 不包括当前元素的两个几个  
   subset := maxSubset(array[1:])  
   subset2 := make([][]int, len(subset))  
   copy(subset2, subset)  
   for i := range subset {  
      subset[i] = append([]int{array[0]}, subset[i]...)  
   }  
   // 这里一个坑,需要把当前元素单独作为一个选项添加进去  
  return append(append(subset, subset2...),[]int{array[0]})  
}

替换占位符

把字符串里面的%s替换到给定字节数组的元素,中间有一个参数n,超过这个参数n之后的内容就不替换了,字符串总长度不能超过500,具体的题目内容印象已经模糊了,所以考点在哪里也不是很清楚。

package main  
  
import "fmt"  
  
func main() {  
   fmt.Printf("%s",replace([]byte("hello %s !"),1,[]byte{'W'}))  
}  
  
func replace(src []byte, n int, placeholder []byte) ([]byte) {  
   var buffer [500]byte  
  // 源字符与目标字符之间的偏移  
  offset := 0  
  // 替换字符的指针  
  m := 0  
  for i := range buffer {  
      if i+offset == len(src) {  
         return buffer[:i]  
      }  
      // 如果遇到 %s 执行替换,并且调整 offset  if src[i+offset] == '%' && src[i+offset+1] == 's' {  
         if m >= n {  
            buffer[i] = src[i+offset]  
            continue  
  }  
         if m < len(placeholder) {  
            buffer[i] = placeholder[m]  
            m++  
         }  
         // 因为题目给的内容就是 %s 替换成一个 byte 所以offset 需要递增  
  offset ++  
      }else{  
         buffer[i] = src[i+offset]  
      }  
   }  
   // 达到字符串上限 直接输出  
  return buffer[:]  
}

这是10月,朴朴来我们学校找人时候,现场技术员笔试的内容,扑扑是福州本土企业,做生鲜到家服务,本部在福州,业务除了福州,在厦门也有发展,当然目前做技术全部都在福州。谢谢朴朴的小礼物。