\HAACHAMA/ \HAACHAMA/ \HAACHAMA/
V1.0.1 第七题已经补上啦
图转侵删
程序设计与实践第二次题目
有一说一这周的题好难啊 也是憋到了周六中午才开始写题解 周四一天就做出来1个 QAQ
T6 改作文
Description
小张的英语不太好,今天他又要面临英语作文的困扰了。
终于他在ddl的前一秒完成了他的作文,但是由于太过匆忙,很多单词的大小写出现了问题。
请你在一秒之内帮他改完英语作文吧!
思路
一夜发白《千字文》
Description
请编写一个程序,从输入中读取一篇中文文章,并统计出该文章中 ASCII 字符以外的重复出现的每一个字重复出现的次数。
文章使用 UTF-8 编码,可能会出现任何可以用 UTF-8 编码表示的字符(不限于中文)。
文章中所有的字符在 UCS-2 能够表示的范围内,即字符的 Unicode 值用两个字节就可以表示。
思路
T8 循环节
Description
小张是一个喜欢规律的人,因此他对数字的循环节颇有研究。
例如,数字123123123,有长度为3,9的循环节。
数字12341234,有长度为4,8的循环节。
数字12345,只有长度为5的循环节。
现在小张给你一个数字 A ,请你帮帮他找到最小的大于 A 且有长度为 L 的循环节的数。
思路
设循环节长度为L,数字A的长度为len。
因为这个题好像99999这种数字做起来会很复杂,所以我干脆把每个位置都是9的单拿出来判断了:
如果全是9:
如果L = 1的话,111111就完事
如果L不是1,那就1000010000这种
一般情况:
如果L > len, 100000000就完事
如果L = len,执行类似高精度加法 +1 一样的东西,算出来比A大1的就完事
如果L < len, 要去判断L是不是len的因子:
如果不是,还是10001000这样就可以
如果是,就要先取出来A的前L位数字,然后每次往后比L位,如果发现有一位大了直接输出就行,如果发现有一位小了需要执行类似高精度加法 +1 一样的东西,直到大了。
注意,这个题必须要严格大于不能等于
最后附上几个自己调试时候犯的错误用例
如果你 7,16WA了 请测试999998这样的 应该输出999999 或者几个999
如果你11,14 WA了 请测试3 123124122这样的 应该输出124124124而不是123123123
如果你 6,15WA了 请测试 3 1这样的 应该输出100而不是111
本人一开始提交的时候WA了这6个,后来一点点调好了,至于别的用例我确实不太清楚。
T9 礼物
Description
小张的好朋友小松要过生日了,小张打算为他挑选一件礼物。在市场上他发现有一个珠子手镯的商店很不错。在这家商店会出售特殊的珠子并穿成一个手镯,在货架上珠子排成一排,每一个珠子上有一个小写英文字母。店家有一个特殊的规定,必须在一排珠子中按顺序从左到右挑选。小张心中已经有一个想要送给小松的单词,请你告诉他应该如何挑选珠子使得手镯上珠子的字母组成小张想要的单词。
思路
这道题我看有的同学被折磨了好久,然后我边听HAACHAMA的歌边写,一遍过了就很神奇,该买彩票了
首先读入的货架上的珠子我叫做tmp,tmp的长度 = len,想要的单词我叫做aim,拿一个his数组记录珠子的下标
这道题我的想法是,先把tmp翻一倍,整了个新串store = tmp复读一遍。
然后从store的第一位开始去匹配aim,如果找到了,his先记下这位的下标i,然后从这位开始继续遍历store一直遍历到i+len,因为如果继续的话,就会串掉。如果aim都匹配齐了输出即可。
这题的限制在于,新找到的store匹配上那一位的下标要么是his里最大的,要么是%len之后比第一位匹配上的还小的,要不然这一位就会插到中间去就不能“串成环形”了。
(有点绕,我感觉我自己都没说太清楚)
T10 括号匹配
Description
DarkDown在乐学上出了一道给定括号序列,判断其合法性的问题。
括号序列是由左括号“(”和右括号“)”组成的非空序列。对于一个括号序列很容易判定其合法性。比如“()”、“(())()”、“(()())”、“(()(()))”、“()()()”都是合法的,而“)”、“(”、“(()”、“(()))(”都是非法的。
Roark看了一眼题,立刻去饮水机处接了一杯水。
DarkDown意识到他是在暗示这道题太水了,于是立刻把题改了改,增加了一、、难度。
给定 n 个括号序列,两两配对,问最多能组成多少对合法括号序列。(每一个括号序列只能在一对中出现)
Roark接完水回来再看了看新题,开始挠头了,快帮帮他!
思路
因为这个题目描述中,判断括号合法性的很方便的方法是用栈,所以我大概就先用栈去做。
一开始我的想法是,随便先抓两个放在一起,然后去判断匹不匹配。
判断匹配的时候我也是,只让左括号进栈,如果输进来一个右括号然后栈是空的那直接就爆炸。
但是,这方法必定TLE,因为我当时都没想明白第二个用例为啥是1,感觉两个交换顺序也不一样啊,为啥是1.
后来DF才告诉我这句话是啥意思:
如果匹配上了相当于就被扔掉了,不会继续参与匹配。
但是由于括号是 类似于二进制的,因为只有左和右,所以不会出现“A跟B,C能匹配,B跟C,D能匹配,C不能匹配D,但是由于我先把AB组合导致原来能匹配两组现在只能匹配一组”的情况
所以后来的想法大概是这样的:
把每个输入进来的括号序列先化简,去掉中间原本本来就能匹配的括号,最后只剩下四种情况:
- 全是左括号
- 全是右括号
- 有左有右
- 啥也不剩(自我匹配)
对于3,因为这个题只能随便抓出来两个进行匹配,所以只要是3这种情况的直接扔掉让他爬。
对于4,4这种必然不能和1,2去匹配,所以最后结果加上4这种情况出现的次数/2就行了。
对于1,2 因为肯定只能是同样数量的左(右)括号去匹配,所以对于每种 同样数量的 左(右)括号的情况,取他们的最小值即可。
例如:
假如“((”有5个,“))”有3个,那最后结果+min(5,3) = 3即可。
鸣谢
QWQ感谢DF和LHL两位大佬的支持QWQ |
最后
感觉之前第一次题目的题解的浏览量还不少…同学萌是真的好能学 XD
如果各位有什么问题或者高见,欢迎在评论区里留言,谢谢各位。
(但是千万别直接把代码贴上来然后求debug)
马上就会补上T7的原理 坑 思路等等。
第七题已经补上啦
(我自己也8太明白,折腾了半天)
希望下次的题能好做一点QWQ