37. 交换字符(第三期模拟笔试)
37. 交换字符(第三期模拟笔试)
原创 已于 2023-10-16 17:17:35 修改 · 粉丝可见 · 1.7k 阅读 · 0 · 1 · 本内容遵循CC 4.0 BY-SA版权协议 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 · 编辑
文章链接:https://blog.csdn.net/hacker_51/article/details/132638975
链接: 卡码网KamaCoder
题目:
| 给定一个01串(仅由字符’0’和字符’1’构成的字符串)。每次操作可以交换两个相邻的字符。 例如:对于字符串”001110”来说, 可以交换第二个字符’0’和第三个字符’1’,交换之后的字符串变成了”010110”。 如果想要最终字符串任意两个相邻的字符都不相同,最少需要多少操作次数? 保证输入的所有字符串测试用例通过交换后一定能够形成相邻两个字符都不相同的字符串。 |
|---|

样例:
cobol<br/>11100<br/> |
|---|
| 3 |
|---|

思路:
贪心思路,观察01串我们知道,如果要01串相邻字符不相同,那么有两种情况出现。
| 1、当 0 和 1 个数不相同的时候, 我们知道肯定是 个数最多的数字作开头, 个数最少的操作的时候可能无法达到01串相邻字符不相同 ---------------------------------------------------------------------------------------------- 2、当 0 和 1 个数相同的时候, 有可能两个数字都可以作为开头,而我们需要找到最少的操作数 |
|---|
沿着这个思路,我们需要的是操作函数,对于操作的时候,我们应该取最近的不同字符进行交换,所以我们需要一个 pos 来错开一个字符,即 pos += 2,
操作步数:对应需要操作数字的下标 - pos 即: step +=abs(i - pos)
代码详解如下:
1 | |
最后提交:

觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭
wechat pay
ali pay
37. 交换字符(第三期模拟笔试)
http://blog.angindem.cn/2023/10/16/Angindem-CSDN博客/047_47/