华为OD题目: 新员工座位安排系统

该文描述了一个关于工位排列的问题,其中工位的友好度由连续的老员工数决定。给定一个工位序列,算法需要找到友好度最高的空位。通过正向和反向遍历,使用哈希表记录连续1的个数,然后计算左右连续老员工数之和,找出最大值。
摘要由CSDN通过智能技术生成

新员工座位安排系统

知识点数组统计 哈希表 左右数组
时间限制: 1s 空间限制: 256MB 限定语言: 不限

题目描述:
工位由序列F1,F2…Fn组成,Fi值为0、1或2。其中0代表空置,1代表有人,2代表障碍物.
1、某一空位的友好度为左右连续老员工数之和
2、为方便新员工学习求助,优先安排友好度高的空位给出工位序列,求所有空位中友好度的最大值.

输入描述:
第一行为工位序列: F1.F2…Fn组成,1<=n<=100000,Fi值为0、1或2。其中0代表空置,1代码有人,2代表障碍物其中0代表空置,1代码有人,2代表障碍物。
输出描述:
所有空位中友好度的最大值。如果没有空位,返回0

示例1
输入:
0 1 0
输出:
1

说明:
第1个位置和第3个位置,友好度均为1

示例2
输入:
1 1 0 1 2 1 0
输出:
3

说明:
第3个位置友好度为3。因障碍物隔断,左边得2分,右边只能得1分

解题思路:

  • 直接正向遍历一遍,反向遍历一遍,遇到0,就把连续1的值记录下来,
  • 用两个map存放,key是0的下标,value是连续1的个数,
  • 将正向和反向map,对应的0,左右加起来取最大值
public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        String[] strings = str.split(" ");

        Map<Integer, Integer> leftToRight = new HashMap<>();
        Map<Integer, Integer> rightToLeft = new HashMap<>();
        //正向遍历,只要num是1,sum就+1,只要不是1,sum则置为0
        int sum = 0;
        for (int i = 0; i < strings.length; i++) {
            int num = Integer.parseInt(strings[i]);
            if (num == 1) {
                sum++;
            } else if (num == 0) {
                leftToRight.put(i, sum);
                sum = 0;
            }else {
                sum = 0;
            }
        }

        sum = 0;
        //反向遍历,从右往左
        for (int i = strings.length - 1; i >= 0; i--) {
            int num = Integer.parseInt(strings[i]);
            if (num == 1) {
                sum++;
            } else if (num == 0) {
                rightToLeft.put(i, sum);
                sum = 0;
            }else {
                sum = 0;
            }
        }

        int max = 0;
        for (int key : leftToRight.keySet()) {
            int val = leftToRight.get(key) + rightToLeft.get(key);
            max = Math.max(val, max);
        }
        System.out.println(max);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值