小红书Android秋招面经

笔试 9.22

20道选择题,共40分;3道编程题,共60分。

选择题

  • Android中给View添加点击事件的方法
  • URL为 http://xxx.com/user/login.do ,是什么方法的请求?
  • 哪些情况会造成ANR
  • 不用四大组件中哪个不用Intent启动
  • SharedPreferences的文件存储路径,SharedPreferences数据读写方法过程
  • 银行家算法,判断哪个顺序不会死锁
  • 合法的出栈顺序
  • 给出排序的中间状态,判断是哪种排序,归并
  • TCP、UDP的特点与区别

编程题

偏难。

第一题:给定一个整数数组和一个整数x,将数组分成连续的任意份,要满足每份的乘积都不能是x的倍数,且数组中每个元素都不是x的倍数。问最少需要分多少份?

有思路,但不知为何只对了18%,小红书的判题器不会给出没通过的测试数据。

分的要尽可能少,则每一份要尽可能大。由于是连续的,可以从头开始看。当乘积变成x的倍数后,无论之后再乘上什么数都仍是x的倍数,因此当乘积变成倍数时就要分了。

定义一个curr记录乘积,初始值为数组第一个元素,从第二个元素开始遍历数组。若乘积对x求模不为0,则curr = curr * a[i];否则,将结果count加一,同时curr = a[i]。遍历结束后,最后一组还要再count加一,输出count。

第二题:给定收藏夹数n和整数x,接下来n行给出每个收藏夹内所有文章的标签,每个收藏夹内标签的数量可能不同,标签可能重复。现在要找出两个收藏夹,满足二者标签种类刚好为x。有满足则输出YES和收藏夹编号,无满足则输出NO。

有思路,但只对了83%。

定义一个vector<vector<string>>用于存储所有收藏夹及其内部的标签。双重循环遍历0 <= i < n - 1)i + 1 <= j < n,每次循环定义一个集合用于标签去重,将两收藏夹的标签全部加入集合,判断集合大小是否等于x。

第三题:给出n条直线,接下来n行,每行给出直线斜率k和截距b,k不为0。问x>0的交点有几个?

没时间写了。