likes
comments
collection
share

刷题录-小红书2020校招Android方向笔试题卷一

作者站长头像
站长
· 阅读数 8

问答题

题目描述

阐述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

问题解答

暂无思路,待填充