1.Nim游戏
题目地址:https://leetcode-cn.com/problems/nim-game/description/
题目描述:
你和你的朋友,两个人一起玩Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。
你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。
public:
bool canWinNim(int n) {
if(n%4==0)
{
return false;
}
else
return true;
}
};
如果此时剩下的石头为6或者7,你都可以拿走一些石头,让对方剩下4个石头,而让你赢。
如果剩下8个石头,对方就可以根据你拿的石头数量,然后给你剩下4个石头,所以你只能输。
综上所述,如果你面对的石头不是4的倍数,你都拿走一些石头,使得对方拿到的石头是4的倍数,从而使得对方输。当你面对的石头数字是4的倍数时,就只能你输了。
性能分析:
时间负责度和空间负责度均为O(1),可见遇到此类题目可以通过思考背后逻辑,简化很多操作。
2.灯泡开关
题目地址:https://leetcode-cn.com/problems/bulb-switcher/description/
题目描述:初始时有 n 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则打开,如果打开则关闭)。第 i 轮,你每 i 个灯泡切换一次开关。 对于第 n 轮,你只切换最后一个灯泡的开关。 找出 n 轮后有多少个亮着的灯泡。
解决方案:
class Solution:
def bulbSwitch(self, n):"""
:type n: int
:rtype: int
"""
return int(math.sqrt(n))
说明:除了平方数,其他都是两个数字相乘得到的,其他数字都可以通过两轮使得灯泡关闭。所以求得从1到n有多少个平方数,就可以求得多少个灯泡,在最后处于亮的状态。
分析:
居然有更优的解答方法,大神果然一个更比一个强
3.在LR字符串中交换相邻字符
题目地址:https://leetcode-cn.com/problems/swap-adjacent-in-lr-string/description/
题目描述:在一个由 'L'
, 'R'
和 'X'
三个字符组成的字符串(例如"RXXLRXRXL"
)中进行移动操作。一次移动操作指用一个"LX"
替换一个"XL"
,或者用一个"XR"
替换一个"RX"
。现给定起始字符串start
和结束字符串end
,请编写代码,当且仅当存在一系列移动操作使得start
可以转换成end
时, 返回True
。
解决方案:
待更新