模拟例题讲解

一、模拟

顾名思义,就是根据题意模拟出结果,一般是通过找到规律,运用之前学过的算法进行辅助模拟。

难点一般就在于找不到模拟方法,或不会用代码写出模拟方法。

二、例题

1、替换所有的问号

. - 力扣(LeetCode)

思路:遇到问号用 a ~ z 依次试出符合要求的字母替换

难点:如果问号在第一个或最后一个,就不是和中间的字母一样比较两边的字母,因为他们旁边只有一个字母。理解代码 if((i == 0 || s[i - 1] != ch) && (i == n - 1 || s[i + 1] != ch))

先考虑 i 位置前面字母情况:如果 i == 0,那就不考虑 s[i - 1],用 || 跳过,如果 i != 0,那就考虑s[i - 1]

再考虑 i 位置后面字母情况:如果 i == n - 1,那就不考虑 s[i + 1],用 || 跳过,如果 i != n - 1,那就考虑s[i + 1]

最后用 && 连接判断结果。

2、提莫攻击

. - 力扣(LeetCode)

我们来模拟一遍

思路:ans 无脑先加持续时间,如果在上一次中毒时间结尾之前又被毒了就计算重复时间减去。

什么时候要计算重复时间?end - t[i] >= 0,考虑一开始 t[i] 可能等于0,end 初始化成 -1

end计算:t[i] + d - 1

重复时间计算:end - t[i] + 1

3、Z字形变换

. - 力扣(LeetCode)

思路:找规律。

4、外观数列

. - 力扣(LeetCode)

思路:双指针

遇到相同的就一直 right 向后,直到是不同的,个数是 right - left,然后 left 右移到 right 位置继续找。由于在 for 循环内部实现了指针的移动,所以 for 循环头部不要有移动。

5、数青蛙

. - 力扣(LeetCode)

思路:如果是 c 就判断 k 是否存在,如果存在就代表已经有青蛙叫完了,我们再让他叫(c++, k--)如果 k 不存在就代表没有青蛙空闲,只能再找一只叫(c++)

遇到其他情况如果前面的字母 > 0,就--,如果等于0,就返回 -1

最后数组中 k 位置就是答案,检查除了 k 位置是否有大于0的,如果有也是返回 -1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值