刷题录-小红书2020校招Android方向笔试题卷一
问答题
题目描述
阐述Activity启动模式singleTop的特征
问题解答
如果调用的目标Activity已经位于调用者的Task的栈顶,则不创建新实例,而是使用当前的这个Activity实例,并调用这个实例的onNewIntent方法
题目描述
触屏事件所涉及的函数调用顺序
问题解答
onTouch -> onTouchEvent -> onClick
题目描述
请根据自己的理解阐述多线程的优点和缺点,Android中主线程的作用以及使用时的注意事项
问题解答
1. 多线程优点:能够适当提高程序的执行效率;能够适当的提高资源的利用率,比如CPU、内存。
2. 多线程缺点:创建线程有额外开销;程序的代码更加复杂;线程越多,CPU在调度线程上的开销就越大;如果开启大量线程,反而会降低程序的性能。
3. 主线程:默认启动的线程,作用是显示和刷新UI界面;处理UI事件;注意不要将耗时操作放在主线程中执行,UI操作必须在主线程中执行
编程题
题目一:字符串倒序
题目描述
薯队长带着小红薯参加密室逃脱团建游戏,首先遇到了反转游戏,小红薯们根据游戏提示收集了多个单词线索,并将单词按要求加一个空格组 成了句子,最终要求把句子按单词反转解密。 说明:收集的时候单词前后可能会有多个空格,反转后单词不能有多个空格,具体见输入输出样例。
示例
输入描述:输入一个字符串。包含空格和可见字符。长度<=100000。
输出描述:输出一个字符串,表示反转后结果。
输入例子1: the sky is blue!
输出例子1:blue! is sky the
问题解答
由于字符串中包含空格,空格位置可能在首尾部分,也可能在中间部分,因此首先可以先通过String.trim()方法,去掉字符串首尾两部分的空格,之后可以将字符串转化为char数组,依次进行遍历,当遇到的字符为非空格时,借助一个空的s字符串来存储这一段不包含空格的字符,当遇到空格时,继续遍历,并将s字符赋值给最后的res,令 res = s+res,同时,当再次遇到空格时,将s置为null,直到遍历完所有的字符,其中要特别注意边界问题与字段间添加空格问题。
import java.util.Scanner;
public class Solution1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String data = scan.nextLine();
if (data.length()==0){
return;
}
data = data.trim();
char[] temp = data.toCharArray();
String res = "";
String s = "";
for (int i = 0;i<temp.length;i++){
if (temp[i]!=' '){
s+=temp[i];
}else {
s+=' ';
res=s+res;
s = "";
while (temp[i]==' '){
i++;
}
i--;
}
}
s+=' ';
res = s+res;
res = res.trim();
System.out.println(res);
}
}
题目二 笔记精选
题目描述
薯队长写了n篇笔记,编号从1~n,每篇笔记都获得了不少点赞数。
薯队长想从中选出一些笔记,作一个精选集合。挑选的时候有两个规则:
1.不能出现连续编号的笔记。
2.总点赞总数最多
如果满足1,2条件有多种方案,挑选笔记总数最少的那种
示例
输入描述:输入包含两行。第一行整数n表示多少篇笔记。 第二行n个整数分别表示n篇笔记的获得的点赞数。 (0<n<=1000, 0<=点赞数<=1000)
输出描述:输出两个整数x,y。空格分割。x表示总点赞数,y表示挑选的笔记总数。
输入例子1:4
1 2 3 1
输出例子1: 4 2
问题解答
根据问题描述,我们可以知道挑选笔记的规则是:编号不能连续,且要保证总点赞数最多,我们将当前已选择笔记的总点赞数设为dp[i],因此我们在挑选一个新的笔记时,我们要将dp[i-1]与dp[i-2]+当前笔记点赞数的和作比较,将较大值作为当前点赞最大数,若前者小于后者,笔记总数进行加1操作,否则继续挑选
import java.util.Scanner;
public class Solution2 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int[] data = new int[n];
for (int i = 0; i < n; i++) {
data[i] = scan.nextInt();
}
int[] dp = new int[n + 1];
if (data.length == 1) {
System.out.println(data[0] + " " + 1);
}
if (data.length == 2) {
System.out.println(data[0] > data[1] ? data[0] : data[1] + " " + 1);
}
dp[0] = data[0];
dp[1] = data[0] > data[1] ? data[0] : data[1];
int[] dpN = new int[n];
dpN[0] = 1;
dpN[1] = 1;
for (int i = 2; i < n; i++) {
if (dp[i - 1] < dp[i - 2] + data[i]) {
dp[i] = dp[i - 2] + data[i];
dpN[i] = dpN[i - 2] + 1;
} else {
dp[i] = dp[i - 1];
dpN[i] = dpN[i - 1];
}
}
System.out.println(dp[n - 1] + " " + dpN[n - 1]);
}
}
题目三:击败魔物
薯队长来到了迷宫的尽头,面前出现了N只魔物,Hi表示第i只魔物的血量,薯队长需要在T个回合内击败所有魔物才能获胜。每个回合薯队长可以选择物理攻击一只魔物,对其造成1点伤害(物理攻击次数无上限);或者消耗1点法力释放必杀技对其造成固定X点伤害(薯队长开始拥有M 点法力)。问X至少多大,薯队长才有机会获胜;如果无论如何都无法在T回合内获胜,则输出 -1
示例
输入描述:第一行三个整数分别表示:N,T,M 第二行有N个整数:H1,H2,H3...HN
输出描述:输出一个整数,表示必杀技一次最少造成多少固定伤害
输入例子1:
3 4 3
5 2 1
输出例子1: 3
问题解答
暂无思路,待填充
转载自:https://juejin.cn/post/7144765350020644872