竞赛地址如下:
第 86 场双周赛
这一次一共有四道题目,分别如下:
- 和相等的子数组
- 严格回文的数字
- 被列覆盖的最多行数
- 预算内的最多机器人数目
刚开始打开竞赛的时候,第一时间看了下四道题目,第一和第二基本属于送分题,第三题属于暴力求解,第四题常规性放弃~~
第一题
给你一个下标从 0 开始的整数数组 nums ,判断是否存在 两个 长度为 2 的子数组且它们的 和 相等。
注意,这两个子数组起始位置的下标必须 不相同 。
如果这样的子数组存在,请返回 true,否则返回 false 。
思路
在读完题目以后,没注意到子数组,所以 WA 了一次,导致罚时 5 min。
子数组是连续数组的一个切片(即占据连续位置),并且固有地保持元素的顺序。
例如:[1,2,3,4,5]
虽然 1 和 4 加起来也是5,但是不能算作子数组。而 [2,3] 是可以算作子数组的。当注意到这个以后,于是迅速的AC了。
class Solution {
public boolean findSubarrays(int[] nums) {
Set<Integer> result = new HashSet<>();
for(int i = 1; i < nums.length; i++){
if(result.contains(nums[i] + nums[i-1])){
return true;
} else {
result.add(nums[i] + nums[i-1]);
}
}
return false;
}
}
第二题
严格回文的数字
如果一个整数 n 在 b 进制下(b 为 2 到 n - 2 之间的所有整数)对应的字符串 全部 都是 回文的 ,那么我们称这个数 n 是 严格回文 的。
给你一个整数 n ,如果 n 是 严格回文 的,请返回 true ,否则返回 false 。
如果一个字符串从前往后读和从后往前读完全相同,那么这个字符串是 回文的 。
思路
首先是定义了一个进制转换的方法,最后通过双指针判断是不是回文。
进制转换
private String build(int i,int n) {
StringBuilder sb = new StringBuilder();
while(n > 0){
int remain = n % i;
if(remain > 10){
sb.append(remain - 'a');
} else {
sb.append(remain);
}
n = n / i;
}
return sb.reverse().toString();
}
其实这里在紧致大于10 的时候,应该判断余树是否应该转成字母,但是考虑到只需要判断回文,所以没必要处理。
思路二
因为 n>=4,而且 n 是可以为 n-2的
那么就会产生一个问题,任意一个数将其转为 n-2 进制的数字,得到的结果一定是 12
所以一定是 false