【数据结构与算法笔试】携程1024秋招笔试

一、题目描述:

游游拿到了一个字符串,她希望你进行以下操作:
操作1:输入1 x y代表删除字符串的第x个字符到第y个字符。
操作2:输入2 x str代表将字符串str插入到第x个字符的后面。
请你输出最终生成的字符串。

输入描述

第一行输入一个字符串 s,代表初始的字符串。
第二行输入一个正整数 q,代表操作次数。
接下来的 q 行,每行输入一行指令1 x y或者2 x str。
1 ≤ len(s), q ≤1000
保证输入的指令均合法,即 x,y 一定不超过当前字符串的长度。
操作2的 x 可能是0,代表将字符串 str 作为前缀插入字符串。
所有 str 的长度之和不超过3000。

输出描述

输出一行字符串,代表操作结束后的字符串。若字符串为空,则输出-1。

示例1
输入

abcde
3
1 2 4
2 1 rca
2 5 a

输出

arcaea

说明:

第一次操作后,字符串变成"ae"。
第二次操作后,字符串变成"arcae"。
第三次操作后,字符串变成"arcaea"。

参考答案:

public class XC1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取初始字符串
        StringBuilder str = new StringBuilder(scanner.nextLine());

        // 读取操作次数
        int q = scanner.nextInt();
        
        scanner.nextLine(); // 处理剩余的换行符

        // 处理每个操作
        for (int i = 0; i < q; i++) {
            String line = scanner.nextLine();
            String[] parts = line.split(" ");

            switch (parts[0]) {
                case "1": // 操作1: 删除字符
                    int x = Integer.parseInt(parts[1]);
                    int y = Integer.parseInt(parts[2]);
                    // 注意:实际的字符串索引从0开始,所以我们减1
                    str.delete(x - 1, y);
                    break;
                case "2": // 操作2: 插入字符串
                    int position = Integer.parseInt(parts[1]);
                    String insertStr = parts[2];
                    // 如果position为0,我们在字符串前插入,否则在指定位置后插入
                    str.insert(position == 0 ? 0 : position, insertStr);
                    break;
            }
        }

        scanner.close();

        // 如果字符串为空,输出-1,否则输出字符串
        if (str.length() == 0) {
            System.out.println("-1");
        } else {
            System.out.println(str.toString());
        }
    }
}

二、题目描述:

游游非常喜欢旅游。她每年会选出 n 个备选的旅游方案,每个方案的目的地为一个城市。
现在给出每个方案的目的城市以及游游对该方案的期待值。
如果在这一年中第一次选择某城市,那么该方案的期待值会翻倍。

已知游游准备选择其中的个方案,使得总期待值尽可能高。你能帮游游求出最大的期待值之和吗?

输入描述

第一行输入两个正整数 n , k ,代表方案总数以及游游可选的方案数量。
接下来的 n 行,每行输入两个正整数 ai和 bi,代表该方案的目的城市为 ai ,期待值为 bi。
1≤ k ≤ n ≤10^5
1≤ ai , bi ,≤10^9

输出描述

一个整数,代表最终的最大期待值之和。

示例1
输入

4 3
1 5
1 6
1 7
3 8

输出

36

说明:

首先选择第3个方案,前往1号城市。由于是第一次选择1号城市,期待值翻倍,获得14期待值。
然后选择第2个方案,获得6期待值。
最后选择第4个方案,前往3号城市。由于是第一次选择3号城市,期待值翻倍,获得16期待值。

参考答案:

public class XC2 {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt(); // 方案总数
        int k = scanner.nextInt(); // 可选方案数量
        Map<Integer, List<Integer>> d = new HashMap<>();
        for (int i=0;i<n;i++){
            int x = scanner.nextInt();
            int y = scanner.nextInt();
            if(!d.containsKey(x)){
                d.put(x, new ArrayList<>());
            }
            
            d.get(x).add(y);
        }
        List<Integer> a = new ArrayList<>();
        for (int i: d.keySet()){
            List<Integer> list = d.get(i);
            Collections.sort(list, Collections.reverseOrder());
            a.add(list.get(0)*2);
            for (int j = 1;j<list.size();j++){
                a.add(list.get(i));
            }
        }
        Collections.sort(a,Collections.reverseOrder());
        long sum = 0;
        for (int i=0;i<k;i++){
            sum += a.get(i);
        }
        // 输出最大期待值之和
        System.out.println(sum);
    }
}

三、题目描述:

游游拿到了一个整数。她希望截取其中的一段,使得这一段代表的整数是72的倍数。游游想知道,共有多少种不同的截取方案?
截取的方案必须是一个合法的整数,即不允许出现前导零。

输入描述

一个正整数 n 。
1≤ n ≤10^100000

输出描述

合法的截取方案数。

示例1
输入

1440

输出

3

说明

共有3种方案:"1440","144","0",这三种截取方案都是合法的。

示例2
输入

10072

输出

3

说明:

有三种截取方案:
截取一个"0",有两种方案都可以截取到"0"(第二个或者第三个数位)
截取“72”,有一种方案可以做到(截取后两位)。

参考答案:

public class XC3 {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        int n = s.length();
        int[][] dp = new int[n][72];
        int ans = 0;
        for (int i = 0; i < n; i++) {
            if (s.charAt(i) != '0') {
                dp[i][Integer.parseInt(String.valueOf(s.charAt(i)))] += 1;
            } else {
                ans += 1;
            }
            if (i == 0) continue;
            for (int j = 0; j < 72; j++) {
                dp[i][(j * 10 + Integer.parseInt(String.valueOf(s.charAt(i)))) % 72] += dp[i - 1][j];
            }
            ans += dp[i][0];
            System.out.println(ans);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CS_木成河

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值