目录
- 专栏导读
- 一、鸣谢
- 二、题目描述
- 三、输入描述
- 四、输出描述
- 五、思路分析
- 解题思路
- 六、Java算法源码
- 七、效果展示
- 1、输入
- 2、输出
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、鸣谢
感谢@中原一点红提供的华为机试真题2023Q1 100分“座位调整”,一看nike标志,就稳了,现金红包已感谢。
祝大家考试顺序,遇到的都刷过,没遇到的都灵光乍现。
二、题目描述
疫情期间课堂的座位进行了特殊的调整,不能出现两个同学紧挨着,必须隔至少一个空位。
给你一个整数数组desk,表示当前座位的占座情况,由若干个0和1组成,其中0表示没有占位,1表示占位。
在不改变原有座位秩序情况下,还能安排坐几个人?
三、输入描述
第一行是一个数组,表示占座情况,由若干个0和1组成,其中0表示没有占位,1表示占位。
四、输出描述
输出数值表示还能坐几个人?
五、思路分析
不能出现两个同学紧挨着,必须隔至少一个空位。
其中0表示没有占位,1表示占位。
也就是说最理想的排座是1,0,1,0,1,0,1。
如果是0,0,1,0,0,1,0,0,0,1 – 变成1,0,1,0,0,1,0,1,0,1即可
解题思路
- 输入一个数组,表示占座情况,由若干个0和1组成,其中0表示没有占位,1表示占位;
- 通过java8 Stream表达式(简洁/方便/上档次)快速拆解输入行;
- 遍历座位数组;
- 如果当前值是0,则继续判断是否需要增加座位;
- 如果是第一个,就不用判断前一个;
- 如果是最后一个,就不用判断下一个;
- 前一个和后一个都是0,则增加1个座位;
- 输出数值表示还能坐几个人。
六、Java算法源码
package com.guor.od;
import java.util.*;
public class OdTest {
/**
* 不能出现两个同学紧挨着,必须隔至少一个空位。
* 其中0表示没有占位,1表示占位
*
* 也就是说最理想的排座是1,0,1,0,1,0,1
*
* 如果是0,0,1,0,0,1,0,0,0,1 -- 变成1,0,1,0,0,1,0,1,0,1即可
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 给你一个整数数组desk,表示当前座位的占座情况,由若干个0和1组成,其中0表示没有占位,1表示占位。
int[] desk = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
// 能坐几个人
int num = 0;
for (int i = 0; i < desk.length; i++) {
// 如果当前值是0,前一个和后一个都是0,则增加1个座位
if (desk[i] == 0) {
// 如果是第一个,就不用判断前一个
boolean startFlag = (i == 0) || (desk[i - 1] == 0);
// 如果是最后一个,就不用判断下一个
boolean endFlag = (i == desk.length - 1) || (desk[i + 1] == 0);
// 前一个和后一个都是0,则增加1个座位
if (startFlag && endFlag) {
num++;
desk[i] = 1;
i++;
}
}
}
// 输出数值表示还能坐几个人
System.out.println(num);
}
}
七、效果展示
1、输入
0,0,1,0,0,1,0,0,0,1
2、输出
2
🏆下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。