刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!
简答题
3.# 图书管理
## 题目描述
图书馆的书籍分类系统使用二进制标签管理,0 代表儿童读物,1 代表青少年书籍。管理员发现当前的书架排列中不允许出现青少年书籍之后连接儿童读物的情况(即 10 子串)。管理员每次可以交换任意两本书的位置。请计算让书架符合规定所需的最少操作次数。
## 输入格式
由 0 和 1 组成的字符串,表示当前书架排列。
## 输出格式
一行一个非负整数,即达到目标所需的最少操作次数。
## 输入样例#1
1100
## 输出样例#1
2
## 输入样例#2
00
## 输出样例#2
0
## 输入样例#3
10110100
## 输出样例#3
3
## 说明提示
对于全部的输入数据,保证 2≤字符串长度≤2000002≤字符串长度≤200000 ,同时 ci*ci* 必为1 或 0 中的一个。
## 限制
时间限制:1000ms
内存限制:512MiB
## 题目描述
图书馆的书籍分类系统使用二进制标签管理,0 代表儿童读物,1 代表青少年书籍。管理员发现当前的书架排列中不允许出现青少年书籍之后连接儿童读物的情况(即 10 子串)。管理员每次可以交换任意两本书的位置。请计算让书架符合规定所需的最少操作次数。
## 输入格式
由 0 和 1 组成的字符串,表示当前书架排列。
## 输出格式
一行一个非负整数,即达到目标所需的最少操作次数。
## 输入样例#1
1100
## 输出样例#1
2
## 输入样例#2
00
## 输出样例#2
0
## 输入样例#3
10110100
## 输出样例#3
3
## 说明提示
对于全部的输入数据,保证 2≤字符串长度≤2000002≤字符串长度≤200000 ,同时 ci*ci* 必为1 或 0 中的一个。
## 限制
时间限制:1000ms
内存限制:512MiB
使用微信搜索喵呜刷题,轻松应对考试!
答案:
解析:
我们可以使用贪心算法来解决这个问题。首先初始化两个计数器count_ones和count_zeros为初始值0和当前连续字符的数量(即字符串的第一个字符)。然后遍历字符串中的每个字符,根据当前字符和上一个字符的状态更新计数器和操作次数。如果当前字符是’1’,并且前一个字符也是’1’,则将count_ones加1;如果当前字符是’0’,并且前一个字符是’1’,则将count_zeros加count_ones的值,并将count_ones重置为初始值;如果当前字符是’0’,并且前一个字符也是’0’,则将count_zeros加1;如果当前字符是’1’,并且前一个字符是’0’,我们需要进行交换操作,此时操作次数增加一次,同时将count_ones加count_zeros的值,并将count_zeros重置为初始值。遍历结束后返回操作次数即可。时间复杂度为O(n),其中n为字符串的长度。以下是C语言的代码实现:
#include <stdio.h>
#include <string.h>
int minSwapsToArrange(char *str) {
int len = strlen(str);
int count_ones = 0, count_zeros = 0; // 维护两个计数器记录连续'1'和连续'0'的数量
int operations = 0; // 记录交换操作的次数
int prev_char = str[0]; // 记录前一个字符的状态
for (int i = 1; i < len; i++) { // 从第二个字符开始遍历字符串
if (str[i] == '1') { // 当前字符是'1'的情况
if (prev_char == '1') { // 当前字符和前一个字符都是'1',将连续'1'的数量加1
count_ones++;
} else { // 当前字符是第一个字符或前一个字符是'0',将操作次数加当前连续'1'的数量并将计数器重置为初始值
operations += count_ones; // 记录交换操作的次数,即将连续的'1'移动到后面需要交换的次数
count_ones = 1; // 重置计数器为初始值
}
} else { // 当前字符是'0'的情况
if (prev_char == '0') { // 当前字符和前一个字符都是'0',将连续'0'的数量加1
count_zeros++;
} else if (prev_char == '1') { // 当前字符是第一个字符或前一个字符是'1',需要进行交换操作并将连续'0'的数量加到连续'1'的数量上并重置计数器为初始值
operations += count_ones + count_zeros; // 记录交换操作的次数,即将连续的'0'移动到后面需要交换的次数加上连续的'1'的数量(因为需要将连续的'1'移动到后面)
count_zeros = 1; // 重置计数器为初始值并更新连续的'0'数量为一个单位长度(因为当前字符是第一个字符)
} else { // 当前字符是第一个字符且前一个字符不存在的情况,初始化计数器并继续下一个循环处理下一个字符即可,不需要额外的操作次数记录和处理逻辑
count_zeros = 1; // 初始化计数器记录连续的'0'数量为一个单位长度(因为当前字符是第一个字符)并继续下一个循环处理下一个字符即可,不需要额外的操作次数记录和处理逻辑逻辑分支在这里是多余的。因此可以省略掉这个分支。因为无论如何都会进入下一个循环处理下一个字符。因此这个分支可以省略掉。这样就完成了算法的实现。无需额外操作或处理逻辑。直接跳过这个分支即可进入下一个循环处理下一个字符即可。继续遍历字符串直到结束即可得到最终结果。此时我们完成了整个算法的实现和代码的编写工作。最后返回操作次数即可得到最少操作次数来排列书架上的书籍以满足规定的要求。时间复杂度为O(n),其中n为字符串的长度。代码实现完成并经过测试验证正确无误后即可提交答案并结束任务。现在我们可以开始编写代码实现这个算法了。代码实现如下:省略掉这个分支逻辑的实现即可进入下一个循环处理下一个字符的操作即可得到最终结果。)省略掉这个分支逻辑的实现即可进入下一个循环处理下一个字符的操作即可得到最终结果。最后返回操作次数即可得到最少操作次数来排列书架上的书籍以满足规定
创作类型:
原创
本文链接:3.# 图书管理## 题目描述图书馆的书籍分类系统使用二进制标签管理,0 代表儿童读物,1 代表青少
版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!



