Leetcode(mystery)

Leetcode(mystery)

leetcode 迷题目

292. Nim 游戏

你和你的朋友,两个人一起玩 Nim 游戏:
桌子上有一堆石头。
你们轮流进行自己的回合,你作为先手。
每一回合,轮到的人拿掉 1 - 3 块石头。
拿掉最后一块石头的人就是获胜者。
j假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为 n 的情况下赢得游戏。如果可以赢,返回 true;否则,返回 false 。

class Solution {
    public boolean canWinNim(int n) {
        return (n%4!=0);
    }
}

319. 灯泡开关

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

在这里插入图片描述

class Solution {
    public int bulbSwitch(int n) {
        if(n==1) return 1;
        int result = 1;
        while(true) {
            if(result*result>n)
                break;
            result++;
        }
        return result-1;
    }
}

521 最长特殊序列 Ⅰ

给你两个字符串,请你从这两个字符串中找出最长的特殊序列。
「最长特殊序列」定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列)。
子序列 可以通过删去字符串中的某些字符实现,但不能改变剩余字符的相对顺序。空序列为所有字符串的子序列,任何字符串为其自身的子序列。
输入为两个字符串,输出最长特殊序列的长度。如果不存在,则返回 -1。

class Solution {
    public int findLUSlength(String a, String b) {
        if (a.equals(b))
            return -1;
        return Math.max(a.length(), b.length());

    }
}

777. 在LR字符串中交换相邻字符

在一个由 ‘L’ , ‘R’ 和 ‘X’ 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True。

class Solution {
    public boolean canTransform(String start, String end) {
        // myidea: L可以看作是只能向左移动,R可以看做是只能向右移动,X可以看做是空格而且如果想向左移动或者想向右移动,只有L右边有X,或者R左边有X才能进行移动
        // 然后,既然是这样,那么我们就可以确定start中的L和end中的L以及start的R与end中的R一定相同
        // 并且,相同相对位置的L,start中的L一定不会出现在end中L的相对位置的左边,同理start中的R一定不会出现在end中R的右边
        // 首先判断二者长度是否相同
        if (!start.replace("X", "").equals(end.replace("X", "")))
            return false;

        int t = 0;
        for (int i = 0; i < start.length(); ++i)
            if (start.charAt(i) == 'L') {
                while (end.charAt(t) != 'L') t++;
                if (i < t++) return false;
            }

        t = 0;
        for (int i = 0; i < start.length(); ++i)
            if (start.charAt(i) == 'R') {
                while (end.charAt(t) != 'R') t++;
                if (i > t++) return false;
            }

        return true;
    }
}

1033. 移动石子直到连续

class Solution {
    public int[] numMovesStones(int a, int b, int c) {
        // 感觉就是判断位置x 与 y 以及 y与z之间的距离
        int x = Math.min(Math.min(a,b),c);
        int z = Math.max(Math.max(a,b),c);
        int y = a+b+c-x-z;
        int dis1 = y-x;
        int dis2 = z-y;
        int[] res = new int[2];
        if(dis1 == 1 && dis2 == 1){
            res[0] = 0;
            res[1] = 0;
        }else if(dis1 == 1 || dis2 == 1){
            res[0] = 1;
            res[1] = Math.max(dis1,dis2) -1;
        }else if(dis1 == 2 || dis2 == 2) {
            res[0] = 1;
            res[1] = dis1+dis2-2;
        }else{
            res[0] =2;
            res[1] = dis1+dis2-2;
        }
        return res;
    }
}

1227. 飞机座位分配概率

class Solution {
    public double nthPersonGetsNthSeat(int n) {
        if(n==1) return 1.0;
        return 0.5;
    }
}

1503. 所有蚂蚁掉下来前的最后一刻

有一块木板,长度为 n 个 单位 。一些蚂蚁在木板上移动,每只蚂蚁都以 每秒一个单位 的速度移动。其中,一部分蚂蚁向 左 移动,其他蚂蚁向 右 移动。
当两只向 不同 方向移动的蚂蚁在某个点相遇时,它们会同时改变移动方向并继续移动。假设更改方向不会花费任何额外时间。
而当蚂蚁在某一时刻 t 到达木板的一端时,它立即从木板上掉下来。
给你一个整数 n 和两个整数数组 left 以及 right 。两个数组分别标识向左或者向右移动的蚂蚁在 t = 0 时的位置。请你返回最后一只蚂蚁从木板上掉下来的时刻。

在这里插入图片描述

class Solution {
    public int getLastMoment(int n, int[] left, int[] right) {
        // 不知道为什么,看了样例之后发现返回的总是最大的值,然后就证实了我的想法是错误的 哈哈哈哈
        // 然后看了不通过的那些案例,又猜想是n-min ,那就尝试一下喽,然后又不对
        // 最后分析了一波,
        int lastMoment = 0;
        for (int ant : left) {
            lastMoment = Math.max(lastMoment, ant);
        }
        for (int ant : right) {
            lastMoment = Math.max(lastMoment, n - ant);
        }
        return lastMoment;  

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值