2019年Byte Camp夏令营5月25日笔试题解

本文详细解析了2019年Byte Camp夏令营的笔试编程题,包括三道题目:第一题涉及景点满意度最大化的求解,采用O(n)复杂度优化;第二题是寻找二维数组中1组成的块数,优化递归调用来避免栈溢出;第三题是字符串嵌套复制,利用栈和自动机解决。
摘要由CSDN通过智能技术生成

笔试题共有4题编程题,前3题较为简单,本文给出相应的思路和解答。

第1题

题目大意:给出n个景点,每个景点有相应的分值 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1,a2,...,an。小明一天之内要游玩两个景点 i , j i, j i,j,景点之间的距离为下标之差的绝对值 ∣ i − j ∣ |i-j| ij,满意度为景点的分值之和减去景点之间的距离,公式为 a i + a j + i − j , ( j > i ) a_i+a_j+i-j, (j>i) ai+aj+ij,(j>i)。要求为小明选出两个景点,给出最大的满意度。
输入:共两行。第一行为n,表示有n个景点;第二行按序给出每个景点的分值。
输出:输出最大的满意度。

解题思路:本题很简单,使用两个for循环即可,但是时间复杂度为 O ( n 2 ) O(n^2) O(n2)。本人就使用此方法解题,但是由于时间复杂度太高,只通过了60%的测试用例。大致代码如下:

    public class Solution {
   
        ...
        public static int handler(int[] arr) {
   
            int max = 0;
            for (int i = 0; i < arr.length; ++i) {
   
                for (int j = i + 1; j < arr.length; ++j) {
   
                    int temp = arr[i] + arr[j] + i - j;
                    max = max >= temp ? max : temp;
                }
            }
            return max;
        }
    }

  后来尝试使用 O ( n l o g n ) O(nlogn) O(nlogn)的时间复杂度,但是没有想到合适的办法。在笔试结束后,突然对有了领悟: a i + a j + i − j = ( a i + i ) + ( a j − j ) , ( j &gt; i ) a_i+a_j+i-j = (a_i + i) + (a_j - j), (j&gt;i) a

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值