目录
第三大的数
https://leetcode.cn/problems/third-maximum-number/description/?envType=list&envId=NaGlEOMa
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
示例 1:
输入:[3, 2, 1] 输出:1 解释:第三大的数是 1 。示例 2:
输入:[1, 2] 输出:2 解释:第三大的数不存在, 所以返回最大的数 2 。示例 3:
输入:[2, 2, 3, 1] 输出:1 解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。 此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
解题思路:
将数组从大到小排序后,从头开始遍历数组,通过判断相邻元素是否不同,来统计不同元素的个数。如果能找到三个不同的元素,就返回第三大的元素,否则返回最大的元素。
class Solution {
public int thirdMax(int[] nums) {
Arrays.sort(nums);
reverse(nums);
for (int i = 1, diff = 1; i < nums.length; ++i) {
if (nums[i] != nums[i - 1] && ++diff == 3) {
// 此时 nums[i] 就是第三大的数
return nums[i];
}
}
return nums[0];
}
public void reverse(int[] nums) {
int left = 0, right = nums.length - 1;
while (left < right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
left++;
right--;
}
}
}
换水问题
https://leetcode.cn/problems/water-bottles/description/
超市正在促销,你可以用
numExchange
个空水瓶从超市兑换一瓶水。最开始,你一共购入了numBottles
瓶水。如果喝掉了水瓶中的水,那么水瓶就会变成空的。
给你两个整数
numBottles
和numExchange
,返回你 最多 可以喝到多少瓶水。示例 1:
输入:numBottles = 9, numExchange = 3 输出:13 解释:你可以用 3个空瓶兑换 1 瓶水。 所以最多能喝到 9 + 3 + 1 = 13 瓶水。示例 2:
输入:numBottles = 15, numExchange = 4 输出:19 解释:你可以用 4个空瓶兑换 1 瓶水。 所以最多能喝到 15 + 3 + 1 = 19 瓶水。提示:
1 <= numBottles <= 100
2 <= numExchange <= 100
class Solution {
public int numWaterBottles(int numBottles, int numExchange) {
int empty = numBottles;//表示总的空瓶数(多少瓶水对应多少个空瓶)
int total = numBottles;//表示共能喝到水的瓶数
while (empty >= numExchange) {//最基本的交换条件:至少要numExchange个空瓶兑换1瓶水
total += empty / numExchange;//能兑换多少瓶水
empty = empty / numExchange + empty % numExchange;//总空瓶数 = 兑换的瓶数 + 剩余没兑换的空瓶数 因为兑换的瓶数最终也是会被消耗变为空瓶数,就相当于空瓶数了
}
return total;
}
}
石子游戏
https://leetcode.cn/problems/stone-game/description/
Alice 和 Bob 用几堆石子在做游戏。一共有偶数堆石子,排成一行;每堆都有 正 整数颗石子,数目为
piles[i]
。游戏以谁手中的石子最多来决出胜负。石子的 总数 是 奇数 ,所以没有平局。
Alice 和 Bob 轮流进行,Alice 先开始 。 每回合,玩家从行的 开始 或 结束 处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止,此时手中 石子最多 的玩家 获胜 。
假设 Alice 和 Bob 都发挥出最佳水平,当 Alice 赢得比赛时返回
true
,当 Bob 赢得比赛时返回false
。示例 1:
输入:piles = [5,3,4,5] 输出:true 解释: Alice 先开始,只能拿前 5 颗或后 5 颗石子 。 假设他取了前 5 颗,这一行就变成了 [3,4,5] 。 如果 Bob 拿走前 3 颗,那么剩下的是 [4,5],Alice 拿走后 5 颗赢得 10 分。 如果 Bob 拿走后 5 颗,那么剩下的是 [3,4],Alice 拿走后 4 颗赢得 9 分。 这表明,取前 5 颗石子对 Alice 来说是一个胜利的举动,所以返回 true 。示例 2:
输入:piles = [3,7,2,3] 输出:true提示:
2 <= piles.length <= 500
piles.length
是 偶数1 <= piles[i] <= 500
sum(piles[i])
是 奇数
class Solution {
public boolean stoneGame(int[] piles) {
return true;
}
}