美团笔试题(2)区间统计

本文详细解析了如何通过定位字符串中值为0的位置,寻找最长的连续1子串,尤其是在给定k个0可转换为1的情况下。通过实例说明了如何利用这些位置来计算可能的最长连续1子串长度,并提供了完整的Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们捋一哈思路: 归结为连续1的问题

对于上面这道题 就是把k个0变成1看哪里最长,是不是可以这么想,只要知道字符串中值为0的位置,以上面这道题为例:

 标号:    0  1  2  3  4  5  6  7  8  9

 字符串:1  0  0  1  0  1  0  1  0  1

值为0的index0[] 为: 1  2  4  6  8

k =2 的值可以是把坐标1 2 的值变为1 那么长度就是 4 index0[2]

k =2 的值可以是把坐标2 4 的值变为1 那么长度就是 4 index0[3] - index[0] - 1  即 6 - 1 - 1 =4

k =2 的值可以是把坐标4 6 的值变为1 那么长度就是 5 index0[4]-index[1]   -1  即 8 - 2 - 1 = 5

k =2 的值可以是把坐标6 8 的值变为1 那么长度就是 5 string.length() - index[2] 即 10 - 4 - 1 = 5

 我们可以发现 其实只要找到index0[] 中连续的连个为0的index即可 我们就以i表示第i个为0的index

i-1 是连续为1字串开始处的前一个0的index ,i + k 是连续为1字串结束处的后一个0的index

那么长度就是index0[i + k] - index0[i - 1] - 1;

在考虑开头处和结尾处的特殊情况

开头:  index0[i + k]

结尾 如果i + k == index0[].length 那么直接就是String.length - index[i-1] - 1;

具体实现看代码

import java.util.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main{
    public static void main(String[] args) throws IOException{
        InputStreamReader input = new InputStreamReader(System.in);
        BufferedReader buffer = new BufferedReader(input);
        String[] str2 = buffer.readLine().split(" ");
        int n = Integer.parseInt(str2[0]);
        int k = Integer.parseInt(str2[1]);
        String[] str = buffer.readLine().split(" ");
        List<Integer> list = new ArrayList<>();
        //统计值是0的index
        for(int i = 0; i < str.length; i++){
            if(str[i].equals("0"))
                list.add(i);
        }
        //如果为0的值小于等于k个 那么能输出连续的1必然是str的长度
        if(k >= list.size()){
            System.out.println(str.length);
        }
        int r = 0;
        for(int i = 0; i <= list.size() - k; i++){
            int cur = 0;
//开头处的处理
            if(i - 1< 0)
                cur = list.get(i+k) - 0;
//结尾处的处理
            if(i + k == list.size())
                cur = str.length - 1 - list.get(i-1);
//中间情况的处理
            if(i-1 >= 0 && i + k < list.size())
                cur = list.get(i + k) - list.get(i - 1) - 1;
            r = Math.max(r, cur);
        }
        System.out.println(r);
    }
}

参考:

https://www.nowcoder.com/profile/953850818/codeBookDetail?submissionId=47299435

### 美团2024年笔试题库及答案 对于希望准备美团2024年技术岗位笔试的同学来说,牛客网是一个非常有价值的资源平台。该网站提供了多场美团秋招和技术岗笔试的真实题目以及详细的解答过程。 #### 编程真题实例分析 针对平均数为k的最长连续子数组问题[^2],这类动态规划类的问题通常需要理解前缀和的概念来优化暴力求解方法的时间复杂度。通过构建辅助数据结构存储中间状态,可以在O(n)时间内完成查询操作而不需要每次都重新遍历整个序列。 关于账单结算逻辑的设计[^3],这里涉及到简单的模拟算法实现。具体而言就是根据输入的数据计算各个参与者之间应该转账的具体金额,并最终汇总成一个简洁的结果列表`payResult[]`用于展示最后每个人的净收支情况。 在外卖定价策略方面[^4],此案例展示了如何处理带有条件约束的成本最小化模型。即在满足一定条件下(如达到特定消费额度),给予顾客额外折扣;同时还要考虑不同促销手段之间的相互排斥关系,确保系统能够自动选取最优支付路径以最大化节省成本。 ```python def calculate_min_cost(dishes, full_reduce_threshold, reduce_amount): original_prices = sum([dish['original'] for dish in dishes]) discounted_prices = sum([min(dish['discount'], dish['original']) for dish in dishes]) # Check if all items are at their original price to apply the reduction. can_apply_reduction = all(dish['discount'] == dish['original'] for dish in dishes) final_price = max(original_prices - (reduce_amount if can_apply_reduction and original_prices >= full_reduce_threshold else 0), discounted_prices) return final_price ``` 上述代码片段实现了对外卖订单总价基于给定参数进行计算的功能,体现了实际业务场景下的编程技巧应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值