292. Nim 游戏
难度简单609
你和你的朋友,两个人一起玩 Nim 游戏:
假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为 n
的情况下赢得游戏。如果可以赢,返回 true
;否则,返回 false
。
示例 1:
输入:n = 4
输出:false
解释:以下是可能的结果:
1. 移除1颗石头。你的朋友移走了3块石头,包括最后一块。你的朋友赢了。
2. 移除2个石子。你的朋友移走2块石头,包括最后一块。你的朋友赢了。
3.你移走3颗石子。你的朋友移走了最后一块石头。你的朋友赢了。
在所有结果中,你的朋友是赢家。
示例 2:
输入:n = 1 输出:true
示例 3:
输入:n = 2 输出:true
class Solution {
/*
1 true
2 true
3 true
4 false X
5 true
6 true
7 true
8 false X
9 true
10 true
11 true
12 false X
13 true
14 true
15 true
16 false X
17 true
18 true
19 true
20 false X
*/
public boolean canWinNim(int n) {
return n % 4 == 0 ? false : true;
}
}
剑指 Offer 64. 求1+2+…+n
难度中等526
求 1+2+...+n
,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3 输出: 6
示例 2:
输入: n = 9 输出: 45
剑指 Offer 64. 求1+2+…+n
求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3
输出: 6
示例 2:
输入: n = 9
输出: 45
1227. 飞机座位分配概率
难度中等103
有 n
位乘客即将登机,飞机正好有 n
个座位。第一位乘客的票丢了,他随便选了一个座位坐下。
剩下的乘客将会:
如果他们自己的座位还空着,就坐到自己的座位上,
第 n
位乘客坐在自己的座位上的概率是多少?
示例 1:
输入:n = 1 输出:1.00000 解释:第一个人只会坐在自己的位置上。
示例 2:
输入: n = 2 输出: 0.50000 解释:在第一个人选好座位坐下后,第二个人坐在自己的座位上的概率是 0.5。
class Solution {
public double nthPersonGetsNthSeat(int n) {
//当n>=2时
//若第1位乘客选择第i个位置,那么第i位乘客将不能坐到自己的位置
//假设第n位乘客坐在自己位置上的概率为f(n)
//当第1位乘客选择第1个位置时,第n位乘客坐在自己位置上的概率为1/n
//当第1位乘客选择第i个位置时,可看作乘客减少了i-1位
// 重新编排后,第i位乘客变成第1位乘客,第n位乘客变成第n-i+1位乘客
// 原第n位乘客坐在自己位置上的概率为1/n*f(n-i+1)
//第1位乘客选择的位置都是等概率的
//所以第n位乘客坐在自己位置上的概率为 1/n + Σ1/n*f(n-i+1)(i=2->n-1)
//f(n) = 1/n * (f(n-1)+f(n-2)+f(n-3)+...+f(2)+1)
//f(n+1) = 1/(n+1)*(f(n)+f(n-1)+f(n-2)+f(n-3)+...+f(2)+1)
//f(n+1) = 1/(n+1)*(f(n)+n*f(n))
//f(n+1) = f(n)
//当n>=2时, f(n)=f(2)=0.5
if(n == 1){
return 1;
}else{
return 0.5;
}
}
}
剑指 Offer 11. 旋转数组的最小数字
难度简单690
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
给你一个可能存在 重复 元素值的数组 numbers
,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2]
为 [1,2,3,4,5]
的一次旋转,该数组的最小值为 1。
注意,数组 [a[0], a[1], a[2], ..., a[n-1]]
旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]]
。
示例 1:
输入:numbers =
[3,4,5,1,2]
输出:1
示例 2:
输入:numbers =
[2,2,2,0,1]
输出:0
class Solution {
public int minArray(int[] numbers) {
Arrays.sort(numbers);
return numbers[0];
}
}
225. 用队列实现栈
难度简单564
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
实现 MyStack
类:
void push(int x)
将元素 x 压入栈顶。int pop()
移除并返回栈顶元素。int top()
返回栈顶元素。boolean empty()
如果栈是空的,返回 true
;否则,返回 false
。注意:
push to back
、peek/pop from front
、size
和 is empty
这些操作。示例:
输入: ["MyStack", "push", "push", "top", "pop", "empty"] [[], [1], [2], [], [], []] 输出: [null, null, null, 2, 2, false] 解释: MyStack myStack = new MyStack(); myStack.push(1); myStack.push(2); myStack.top(); // 返回 2 myStack.pop(); // 返回 2 myStack.empty(); // 返回 False
class MyStack {
private Queue a;//输入队列
private Queue b;//输出队列
public MyStack() {
a = new LinkedList<>();
b = new LinkedList<>();
}
public void push(int x) {
a.offer(x);
// 将b队列中元素全部转给a队列
while(!b.isEmpty())
a.offer(b.poll());
// 交换a和b,使得a队列没有在push()的时候始终为空队列
Queue temp = a;
a = b;
b = temp;
}
public int pop() {
return b.poll();
}
public int top() {
return b.peek();
}
public boolean empty() {
return b.isEmpty();
}
}
剑指 Offer 29. 顺时针打印矩阵
难度简单447
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7]
class Solution {
public int[] spiralOrder(int[][] matrix) {
int row = matrix.length;
if (row == 0) {
return new int[0];
}
int col = matrix[0].length;
int[] res = new int[row * col];
int idx = 0;
int left = 0, top = 0, right = col - 1, bottom = row - 1;
while (true) {
//从左往右走
for (int i = left; i <= right; i++) {
res[idx++] = matrix[top][i];
}
if (++top > bottom) {
break;
}
//从上往下走
for (int i = top; i <= bottom; i++) {
res[idx++] = matrix[i][right];
}
if (--right < left) {
break;
}
//从右往左走
for (int i = right; i >= left; i--) {
res[idx++] = matrix[bottom][i];
}
if (--bottom < top) {
break;
}
//从下往上走
for (int i = bottom; i >= top; i--) {
res[idx++] = matrix[i][left];
}
if (++left > right) {
break;
}
}
return res;
}
}