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;
}
}