算法题--华为od机试考试(补种未成活胡杨、最大N个数与最小N个数的和、最长广播响应)

目录

补种未成活胡杨

题目描述

输入描述

输出描述

示例1

输入

输出

示例2

输入

输出

解析

答案

最大N个数与最小N个数的和

题目描述

输入描述

输出描述

示例1

输入

输出

解析

答案

最长广播响应

题目描述

注意

输入描述

输出描述

示例1

输入

输出

示例2

输入

输出

解析

答案


补种未成活胡杨

考察移动窗口、双指针、hash

题目描述

近些年来,我国防沙治沙取得显著成果。某沙漠新种植N棵胡杨(编号1-N),排成一排。一个月后,有M棵胡杨未能成活。现可补种胡杨K棵,请问如何补种(只能补种,不能新种),可以得到最多的连续胡杨树?

输入描述

第一行:N总种植数量;

第二行:M未成活胡杨数量;

第三行:M个空格分隔的数,按编号从小到大排列

第四行:K最多可以补种的数量

其中:

1<=N<=100000

1<=M<=N

0<=K<=M

输出描述

最多的连续胡杨棵树

示例1

输入

5

2

2 4

1

输出

3

示例2

输入

13

4

1 4 8 9

1

输出

6

解析

使用双指针指向开头,尾指针向后逐个移动,保证头尾指针之间存在的未种活胡杨树为可补种树,当超过时,头指针向后移动,移动过程中记录窗口的最大长度,直到尾指针移动到最后一个元素结束。

答案

function getContinuousNum(str) {
    let [N, M, Marr, K] = str.split('\n')
    let hash = {}
    Marr.split(' ').forEach(v => {
        hash[v] = true
    })
    let start = 1
    let end = 1
    let res = 0
    let dead = 0
    // let live = 0
    let len = 0
    while (end <= N) {
        if (hash[end]) {
            dead++
        }
        len++
        // 窗口中死的大于可补种树
        while (dead > K && end >= start) {
            if (hash[start]) {
                dead--
            }
            start++
            len--
        }
        if (end - start + 1 > res) {
            res = end - start + 1
        }
        end++
    }
    return res
}
console.log(getContinuousNum(`5
2
2 4
1`))
console.log(getContinuousNum(`13
4
1 4 8 9
1`))

最大N个数与最小N个数的和

考察排

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值