一、
给你一个整数 n
,如果你可以将 n
表示成若干个不同的三的幂之和,请你返回 true
,否则请返回 false
。
对于一个整数 y
,如果存在整数 x
满足 y == 3x
,我们称这个整数 y
是三的幂。
class Solution {
public boolean checkPowersOfThree(int n) {
while (n > 0) {
if (n % 3 == 2) {
return false;
}
n /= 3;
}
return true;
}
}
这段代码定义了一个名为Solution的类,其中包含一个名为checkPowersOfThree的公共方法。该方法接受一个整数n作为参数,并返回一个布尔值。
在方法中,使用while循环来迭代处理输入的整数n。在每次循环中,首先检查n是否大于0。如果n除以3的余数为2,则返回false,表示n不能表示为3的幂。然后将n除以3,继续下一次循环。
如果循环结束后仍未返回false,则说明n可以表示为3的幂,此时返回true。
因此,该方法的功能是检查输入的整数n是否可以表示为3的幂。
二、
1855. 下标对中的最大距离https://leetcode.cn/problems/maximum-distance-between-a-pair-of-values/
给两个 非递增 的整数
给你两个 非递增 的整数数组 nums1
和 nums2
,数组下标均 从 0 开始 计数。
下标对 (i, j)
中 0 <= i < nums1.length
且 0 <= j < nums2.length
。如果该下标对同时满足 i <= j
且 nums1[i] <= nums2[j]
,则称之为 有效 下标对,该下标对的 距离 为 j - i
。
返回所有 有效 下标对 (i, j)
中的 最大距离 。如果不存在有效下标对,返回 0
。
一个数组 arr
,如果每个 1 <= i < arr.length
均有 arr[i-1] >= arr[i]
成立,那么该数组是一个 非递增 数组。
class Solution {
public int maxDistance(int[] nums1, int[] nums2) {
//双指针
int p1 = 0;
int p2 = 0;
//最大距离
int maxAway = 0;
//如果未越级
while (p1 < nums1.length && p2 < nums2.length) {
//如果当前是结果之一
if (nums1[p1] <= nums2[p2]) {
//尝试刷新结果,并走快指针
maxAway = Math.max(maxAway, p2++ - p1);
} else {
//慢指针走
p1++;
}
}
//返回最大情况
return maxAway;
}
}
这段代码是一个解决问题的类,其中包含一个方法`maxDistance`用于计算两个数组`nums1`和`nums2`中元素的最大距离。
- 使用双指针`p1`和`p2`分别指向`nums1`和`nums2`的起始位置。
- 初始化`maxAway`为0,用于记录最大距离。
- 在`p1`和`p2`未超出数组范围的情况下进行循环:
- 如果`nums1[p1]`小于等于`nums2[p2]`,则尝试更新`maxAway`为当前距离`p2 - p1`和之前的`maxAway`中的较大值,同时移动快指针`p2`。
- 否则,移动慢指针`p1`。
- 返回最大距离`maxAway`。
这段代码的主要思想是通过双指针的方式在两个数组中找到满足条件的元素对,计算它们之间的距离,并更新最大距离。
三、
1217. 玩筹码https://leetcode.cn/problems/minimum-cost-to-move-chips-to-the-same-position/
有 n
个筹码。第 i
个筹码的位置是 position[i]
。
我们需要把所有筹码移到同一个位置。在一步中,我们可以将第 i
个筹码的位置从 position[i]
改变为:
position[i] + 2
或position[i] - 2
,此时cost = 0
position[i] + 1
或position[i] - 1
,此时cost = 1
返回将所有筹码移动到同一位置上所需要的 最小代价 。
public int minCostToMoveChips(int[] chips) {
int odd = 0, even = 0;
for (int i = 0; i < chips.length; i++) {
if (chips[i] % 2 == 0) {
even++;
} else if (chips[i] % 2 != 0) {
odd++;
}
}
return Math.min(even, odd);
}
难点在于理解题目意思。chips = [1, 2, 2, 2, 3, 15, 23] 意味着位置1有1个筹码,位置2有3个筹码,同样位置3、15、23各有1个筹码。把所有筹码移动到一个位置,移动两步代价为0,那其实我就可以把所有“奇数位置”筹码移动到一个点A(奇数位置),且不必花费任何代价;同理,所有“偶数位置”的筹码移动到点B(偶数位置)也不需要任何代价。最终就是看A,B两点谁的筹码数多,把少的筹码移动到多的筹码的位置,每一个筹码的代价都是1。