题目
-
- 可见点的最大数目
- 可见点的最大数目
-
- 使整数变为 0 的最少操作次数
思路与算法
- 第一题注意添加角度时atan2的范围是正负π,因此注意差值可能超出这个范围,因此将计算出的角度+2π再次存入即可避免这个错误。
- 第二题格雷码逆处理过程,不再赘述,见代码
代码实现
-
- 可见点的最大数目
class Solution {
public int visiblePoints(List<List<Integer>> points, int angle, List<Integer> location) {
int pointCnt = points.size();
List<Double> angles = new ArrayList<>();
int extraAns = 0;
for (int i = 0; i < pointCnt; i++) {
int deltaY = points.get(i).get(1) - location.get(1);
int deltaX = points.get(i).get(0) - location.get(0);
if (deltaX == 0 && deltaY == 0){
extraAns++;
continue;
}
double curAngle = Math.atan2(deltaY,deltaX);
angles.add(curAngle);
angles.add(curAngle + 2 * Math.PI);
}
Collections.sort(angles);
int ans = 0;
int left = 0;
int right = 0;
double maxAngle = angle * Math.PI / 180.0;
while (true) {
if (right == angles.size()) {
return ans + extraAns;
}
if (angles.get(right) - angles.get(left) <= maxAngle) {
ans = Math.max(ans, right - left + 1);
right++;
} else {
left++;
}
}
}
}
-
- 使整数变为 0 的最少操作次数
class Solution {
public int minimumOneBitOperations(int n) {
int ans = 0;
while (n != 0) {
ans ^= n;
n >>= 1;
}
return ans;
}
}
写在最后
冲!