蓝桥杯题目——翻硬币无需修改‘*’与’o‘的特殊解法及其所包含的思想

首页>滚动 > 正文
2023-02-13 20:13:29

来源:腾讯云

前言

本文介绍蓝桥杯题目——翻硬币的一种无需对字符串进行操作的解法及该解法所包含的思想。

题目信息

桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。

比如,可能情形是:**oo***oooo


(相关资料图)

如果同时翻转左边的两个硬币,则变为:oooo***oooo

现在的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?

我们约定:把翻动相邻的两个硬币叫做一步操作。

输入格式

两行等长的字符串,分别表示初始状态和要达到的目标状态。

输出格式

一个整数,表示最小操作步数

数据范围

输入字符串的长度均不超过100。

数据保证答案一定有解。

输入样例

**********o****o****

输出样例

5

解题思维

假设这样一组输入:

**********o*********

因为每次要翻动两个硬币,想单独地把第一个硬币变成o,就一定会带来副作用(影响其他的硬币),即使这个硬币不在第一个位置。

也就意味着我们用任何方法也不能单独地将一个硬币反转,必须要有另一个同样需要反转的硬币。

因此,题目给的数据中,两个字符串不同之处的数量一定为偶数,否则第一个字符串无论怎样翻转也不能达到第二个字符串(目标)的状态。

思想(1)

因为每个硬币只有正、反两种可能,所以一组硬币(一次反转两个,因此称两个硬币为一组)如果已经被反转一次了,如果再将其反转回来,就会使得这两次反转都无意义。

一般地说,就像同类费解的开关和点灯这种每个位置只有两种选择的问题一样,同一个位置,操作两次,都是无意义的。

在本题中,同一组硬币,我们最多只会翻转一次,拿题目给出的数据举例,我们的目的是把一号和六号的硬币反转成为o。

image.png

第一次,我们反转前两个。

image.png

第二次,我们的目的是将2号的o变成*,因为1和2这一组已经被反转一次,因此第二次我们只能选择2和3这一组。

image.png

第三次,目的是反转3号,但23这一组已被反转,因此只能反转34这一组。

image.png

第四次,同理,只能反转45这一组。

image.png

第五次,当反转56这一组时会发现,反转后的状态刚好就是我们所求的状态,这正是刚才解题思维中说到的有另一个需要反转的硬币(6号)来弥补之前的硬币(1号)反转所带来的副作用。

image.png

此时你会发现,从1号到6号,其包含的每一组我们都反转了一次,其间的每一个硬币我们都反转了两次,只有这样才能刚刚好使得两个不同之处变为相同。

原因:其间的硬币反转两次,相当于没反转;其包含的最开始和最后一个硬币,只反转了一次,因此改变的正反面。

因此,对于这题我们只需要找到每两个不同之处之间有多少个硬币,就可以推算出将这两个不同之处同时反转,需要消耗几步。

思想(2)

如果做题时没有发现每同时反转两个不同之处所消耗的步数等于其间的硬币数+1这条规律,那么大概率会用模拟法做,那无疑就使代码更加复杂。

一数曾说过下文类似的一句话:像这种看起来很简单,但是数据很大,暴力法做不了的;看起来像一般性题,但一般性方法做不了的,通常在题目中都有隐含的条件没有发现,一旦发现,此类题目将特别简单。

代码实现

首先,写出主函数和用来输入输出的函数。

int main(){char str1[120];gets_s(str1);char str2[120];gets_s(str2);int time =sta(str1, str2);printf("%d", time);return 0;}

随后对sta函数进行实现。

我们要统计的数目是每一组不同之处之间的硬币数,因此设置一个变量flag,当其为1时代表遇到了一组不同中的第一个不同,此时开始统计数目,当其为-1时,代表遇到了一组不同中的第二个不同,此时不统计数目。

int sta(char* str1, char* str2){int count = 0;int flag = -1;//是否开启统计while (*str1 != "\0"){if (*str1 != *str2){flag *= -1;}if (flag==1){count++;}str1++;str2++;}return count;}

可见,代码中并没有对字符串的任何操作,极大地减轻了代码量。

思想(3)

在实现sta函数时,并没有将flag的初始值设为0,而是设为了-1。

这样做可以在开启或关闭统计时直接让其乘以-1即可,不用再判断flag此时是哪一种情况。

亦或者在用模拟法的时候,表示正面,o 表示反面,那么你在反转时要先判断当前位置是 还是 o,但是如果用1表示正面,-1表示反面,你在反转的时候不需要判断,只需要让其乘以-1即可。

亦或者像费解的开关那样,用1表示开,0表示关,这样你在打开或关闭的时候,只要让其赋值为自身的非即可,不必额外判断当前的情况。

感谢您的阅读与耐心~ 如有错误烦请指出~ 谢谢

标签: 编程算法

THE END
免责声明:本文系转载,版权归原作者所有;旨在传递信息,不代表热讯制鞋网的观点和立场。

相关热点

新华社电 上海市文化和旅游局近日发布《上海市密室剧本杀内容备案管理规定(征求意见稿)》,并截至12月8日面向社会公众广泛征求意见。这
2021-11-19 13:46:03
《中国证券报》17日刊发文章《备战2022 基金经理调仓换股布新局》。文章称,距离2021年结束仅剩一个多月,基金业绩分化明显。部分排名靠前
2021-11-19 13:46:03
交通运输部办公厅 中国人民银行办公厅 中国银行保险监督管理委员会办公厅关于进一步做好货车ETC发行服务有关工作的通知各省、自治区、直
2021-11-19 13:45:58
新华社北京11月17日电 题:从10月份市场供需积极变化看中国经济韧性新华社记者魏玉坤、丁乐读懂中国经济,一个直观的视角就是市场供需两端
2021-11-19 13:45:58
全国教育财务工作会议披露的消息称,2020年,中国国家财政性教育经费投入达4 29万亿元,占GDP总量的4 206%,我国国家财政性教育经费支出占G
2021-11-19 13:45:48
如果你也热爱“种草”,前方高能预警!让你心心念念、“浏览”忘返的网络平台,可能早已成为一块块“韭菜地”。近日,据《半月谈》报道,有...
2021-11-19 13:45:48
日前,工业和信息化部印发《“十四五”信息通信行业发展规划》(以下简称《规划》),描绘了未来5年信息通信行业的发展趋势。《规划》指出...
2021-11-19 13:45:40
本报讯(中青报·中青网记者 周围围)2021年快递业务旺季正式拉开帷幕。国家邮政局监测数据显示,仅11月1日当日,全国共揽收快递包裹5 69
2021-11-19 13:45:40
人民网曼谷11月17日电 (记者赵益普)17日上午,中国援柬埔寨第七批200万剂科兴新冠疫苗抵达金边国际机场。当天,柬埔寨政府在机场举行了
2021-11-19 13:45:35
金坛压缩空气储能国家试验示范项目主体工程一角受访者供图依托清华大学非补燃压缩空气储能技术,金坛压缩空气储能项目申请专利百余项,建立
2021-11-19 13:45:35
视觉中国供图42亿立方米据有关部门预计,今年山西煤炭产量有望突破12亿吨,12月份山西外送电能力将超过900万千瓦,今冬明春煤层气产量将达4
2021-11-19 13:44:34
14省份相继发布2021年企业工资指导线——引导企业合理提高职工工资今年以来,天津、新疆、内蒙古、陕西、西藏、山东、江西、山西、福建、四
2021-11-19 13:44:34
中新网客户端北京11月18日电 (记者 谢艺观)“一条路海角天涯,两颗心相依相伴,风吹不走誓言,雨打不湿浪漫,意济苍生苦与痛,情牵天下喜
2021-11-19 13:44:31
近日,交通运输部等三部门发布《关于进一步做好货车ETC发行服务有关工作的通知》。通知提到,对不具备授信条件的用户,商业银行可在依法合
2021-11-19 13:44:31
欧莱雅面膜陷优惠“年度最大”风波 涉及该事件集体投诉超6000人次美妆大牌双十一促销翻车?近日,因预售价格比双十一现货贵出66%,欧莱雅
2021-11-19 13:44:13
43 6%受访者会在工作两三年后考虑跳槽54 3%受访者认为跳槽对个人职业发展有利有弊如今对不少年轻人来说,想对一份工作“从一而终”不太容易
2021-11-19 13:44:13
超八成受访青年表示如有机会愿意开展副业 规划能力最重要64 4%受访青年指出做副业跟风心态最要不得如今,“身兼数职”已成为年轻人当中的
2021-11-19 13:44:01
发展氢能正当其时【科学随笔】氢能是一种二次能源,它通过一定的方法利用其他能源制取,具有清洁无污染、可储存、与多种能源便捷转换等优点
2021-11-19 13:44:01
“千杯不醉”的解酒“神药”能信吗?专家:网红“解酒药” 其实不算药俗话说,“酒逢知己千杯少”,酒一直是国人饭桌上至关重要的存在。尽...
2021-11-19 13:43:57
最新文章

相关推荐