Leetcode刷题(八)脑筋急转弯

1.Nim游戏

题目地址:https://leetcode-cn.com/problems/nim-game/description/

题目描述:

你和你的朋友,两个人一起玩Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。

你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。

解决方法:
class Solution {
public:
    bool canWinNim(int n) {
        if(n%4==0)
        {
            return false;
        }
        else 
            return true;
    }
};
说明:这里强调的是两个人都是非常理智的玩家。
如果最后剩下1-3个石头,你肯定是赢家,如果此时剩下4个石头,你无论拿多少个,对方一定会赢。
如果此时剩下5个石头,这时你的最佳策略是拿走一个石头,这是对方就回到了你面对4个石头的情况,这时候你肯定赢。

如果此时剩下的石头为6或者7,你都可以拿走一些石头,让对方剩下4个石头,而让你赢。

如果剩下8个石头,对方就可以根据你拿的石头数量,然后给你剩下4个石头,所以你只能输。

综上所述,如果你面对的石头不是4的倍数,你都拿走一些石头,使得对方拿到的石头是4的倍数,从而使得对方输。当你面对的石头数字是4的倍数时,就只能你输了。

性能分析:

时间负责度和空间负责度均为O(1),可见遇到此类题目可以通过思考背后逻辑,简化很多操作。

2.灯泡开关

题目地址:https://leetcode-cn.com/problems/bulb-switcher/description/

题目描述:初始时有 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则打开,如果打开则关闭)。第 i 轮,你每 个灯泡切换一次开关。 对于第 轮,你只切换最后一个灯泡的开关。 找出 轮后有多少个亮着的灯泡。

解决方案:

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

解决方案:

待更新

猜你喜欢

转载自blog.csdn.net/weixin_38368941/article/details/80492608