2020届校招:腾讯技术类第一次笔试题整理

1、字符串解压缩
某种压缩算法,对于字符串中连续的 m 个相同字符串 S 将会压缩为 [m | S] (m 为一个整数且 1<= m <= 100),例如字符串 ABCABCABC 将会被压缩为 [3|ABC] ,现在需要对压缩后的字符串解压缩。
输入:
HG[3|B[2|CA]]F
输出:
HGBCACABCACABCACAF
说明:
HG[3|B[2|CA]]F -> HG[3|BCACA]F -> HGBCACABCACABCACAF
import java.util.Scanner;
import java.util.Stack;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();

        Stack<String> stack = new Stack<String>();
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < str.length(); i++) {
            char tmp = str.charAt(i);

            if (tmp == '[') {
                //遇 '[',则入栈
                stack.push(tmp + "");
            } else if (tmp == ']') {
                //遇 ']',则出栈
                String now = "";
                String left = "[";

                //从栈中取出'['和']'之间的字符,拼接成字符串
                while (!left.equals(stack.peek())) {
                    now = stack.pop() + now;
                }

                //'['出栈
                stack.pop();
                //将重复的字符还原
                String re = build(now);

                if (stack.empty()) {
                    //添加到最终结果
                    sb.append(re);
                } else {
                    stack.push(re);
                }
            } else {
                if (stack.empty()) {
                    sb.append(tmp);
                } else {
                    stack.push(tmp + "");
                }
            }
        }

        System.out.println(sb.toString());
    }

    private static String build(String str) {
        String[] arr = str.split("\\|");
        int num = Integer.valueOf(arr[0]);
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < num; i++) {
            sb.append(arr[1]);
        }

        return sb.toString();
    }
}
2、逆序对个数
Q有一个数列有2^n个数,老板一共问Q m 次,每次给出一个整数 q_i(1 <= i <= m),要求Q把这些数每 2^q_i 分为一组,然后每组进行反转,求每次操作后整个序列中的逆序对个数。
例如:
对于序列 1 3 4 2,逆序对有 (4,2),(3,2),总数量为 2.
反转之后为 2 4 3 1,逆序对有 (2,1),(4,3),(4,1),(3,1),总数量为 4.
    
输入描述:
第一行一个数 n(0 <= n <= 20);
第二行 2^n 个数,表示初始的序列(1 <= 初始序列 <= 10^9)

输入:
2
2 1 4 3
4
1 2 0 2
输出:
0
6
6
0

说明:
初始序列: 2 1 4 3
2^q_1 = 2   -> 第一次: 1 2 3 4  -> 逆序对数为 0
2^q_2 = 4   -> 第一次: 4 3 2 1  -> 逆序对数为 6
2^q_3 = 1   -> 第一次: 4 3 2 1  -> 逆序对数为 6
2^q_4 = 4   -> 第一次: 1 2 3 4  -> 逆序对数为 0

3、覆盖河道
一段河道长L,可看作是 [0,1] 的一条数轴,此时有 n 个提供视野的道具,第 i 个道具能够覆盖的范围是 [x_i, y_i],问至少用几个道具即可覆盖河道。
输入描述:
输入包括 n+1 行
第一行包括两个正数 n 和 L,(1 <= n <= 10^5, 1 <= L <= 10^9)
接下来的 n 行,每行两个正整数 x_i, y_i,(0 <= x_i <= y_i <= 10^9,表示第 i 个道具覆盖的区间)

输出描述:
一个整数,表示最少需要的道具数量,如果无解,则输出 -1;

输入:
4 6
3 6
2 4
0 2
4 7
    
输出:
3


4、楼数
一条街上有 n 栋楼,Q想知道在每栋楼的位置能看到多少栋楼(当前面的楼高度大于等于后面的楼时,后面的楼被挡住。)
输入描述:
第一行包含一个数字 n,代表楼的栋数,接下来的一行包含 n 个数字 w_i(1 <= i <= n),
代表每一栋楼的高度。
1 <= n <= 100000;
1 <= w_i <= 100000;

输出描述:
输出一行,包含空格分隔的 n 个数字 v_i,分别代表 Q 在第i栋楼时能看到的楼的数量。

输入:
6
5 3 8 3 2 5

输出:
3 3 5 4 4 4
    
说明:
当 Q 处于位置 3 时,他可以向前看到位置 2, 1 处的楼,向后看到位置 4,6 处的楼,
加上第3栋楼,共可以看到5栋楼。处于 4 位置时,向前可看到 位置 3 的楼,向后可看到
位置 5,6 处的楼,加上第 4 栋楼,共可看到 4 栋楼。




全部评论

相关推荐

04-05 21:13
邯郸学院 Java
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客企业服务