座位调整
难度:★
前后各加一个空位巧妙的处理前后边界问题。
座位调整
知识点迭代
时间限制:1s 空间限制:256MB 限定语言:C(clang11), C++(clang++11), Java(javac 1.8), Python3(3.9), JavaScript Node(12.18.2), Go(1.14.4)
题目描述:
疫情期间课堂的座位进行了特殊的调整,不能出现两个同学紧挨着,必须隔至少一个空位。
给你一个整数数组 desk表示当前座位的占座情况,由若干 0 和 1 组成,其中 0 表示没有占位,1 表示占位。在不改变原有座位秩序情况下,还能安排坐几个人?
输入描述:
第一行是个子数组表示作为占座情况,由若干 0 和 1 组成,其中 0 表示没有占位,1 表示占位
输出描述:
输出数值表示还能坐几个人
补充说明:
1 <= desk.length <= 2 * 10^4
示例1
输入:
1,0,0,0,1
输出:
1
说明:
只有desk[2]的位置可以坐一个人
解题思路:
- 首先,使用
Scanner
读取输入的字符串,将其按逗号分隔为字符串数组。 - 创建一个新的整数数组
nums
,长度比输入数组多两个元素,用于处理边界情况。 - 将左侧边界和右侧边界的值都设置为0,表示空位。
- 将输入的字符串数组转换为整数数组。
- 遍历整数数组,从第2个元素到倒数第2个元素,判断当前位置及相邻位置是否均为空位,如果是,则将当前位置设置为已占位,坐下的人数加1。
- 输出可以坐下的人数。
JAVA代码:
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String[] str = scan.nextLine().split(","); // 读取输入并按逗号分隔字符串
scan.close();
int count = 0;
int[] nums = new int[str.length + 2]; // 创建一个新的整数数组,比输入数组多两个元素
nums[0] = 0; // 左侧边界设置为0,表示空位
nums[nums.length - 1] = 0; // 右侧边界设置为0,表示空位
// 将输入字符串转换为整数数组
for (int i = 1; i <= str.length; i++) {
nums[i] = Integer.parseInt(str[i - 1]);
}
// 遍历整数数组,查找可以坐下的位置
for (int i = 1; i <= str.length; i++) {
if (nums[i] == 0 && nums[i - 1] == 0 && nums[i + 1] == 0) { // 当前位置及相邻位置均为空位
nums[i] = 1; // 将当前位置设置为已占位
count++; // 坐下的人数加1
}
}
System.out.println(count); // 输出可以坐下的人数
}
代码说明:
代码思路和实现说明如下:
- 首先,通过
Scanner
读取输入的字符串,并使用split(",")
方法按逗号分隔字符串为一个字符串数组str
。 - 使用
scan.close()
关闭Scanner
对象,释放资源。 - 创建一个整数变量
count
用于计数坐下的人数。 - 创建一个整数数组
nums
,长度为输入数组str
的长度加2,多出的两个元素用于处理边界情况。 - 将
nums
数组的第一个元素和最后一个元素设置为0,表示左侧边界和右侧边界的空位。 - 使用
Integer.parseInt()
方法将str
数组中的字符串转换为整数,并存入nums
数组中。 - 使用循环遍历
nums
数组,从第2个元素到倒数第2个元素。 - 在循环中,检查当前位置及相邻位置是否均为空位(即
nums[i]
、nums[i-1]
和nums[i+1]
均为0)。 - 如果满足条件,则将当前位置
nums[i]
设置为已占位(即1),并将count
加1。 - 循环结束后,输出
count
变量的值,即可以坐下的人数。