📖本文目录
🙊写在前面
🙊小付来喽,今天接着有更新周赛栏目了哦,今天小付第三次打周赛,相对之前,我只知道网易互娱出的题是真的多多少少沾点,确实难也确实考验做题者的水平,果然大厂就是大厂,出的题都让你rua脑阔掉头发,今天小付只A了两道题,争取把第三题的大佬题解给大家讲清楚,就这样吧,冲冲冲!
📆第278场周赛——2022-01-30
📝T1.5993. 将找到的值乘以 2
题目
示例
示例1:
输入:nums = [5,3,6,1,12], original = 3
输出:24
解释:
- 3 能在 nums 中找到。3 * 2 = 6 。
- 6 能在 nums 中找到。6 * 2 = 12 。
- 12 能在 nums 中找到。12 * 2 = 24 。
- 24 不能在 nums 中找到。因此,返回 24 。
示例2:
输入:nums = [2,7,9], original = 4
输出:4
解释:
- 4 不能在 nums 中找到。因此,返回 4 。
提示
1 <= nums.length <= 1000
1 <= nums[i], original <= 1000
⭐思路 ⭐
简单排序
+ 一次遍历判断
代码实现
class Solution {
public int findFinalValue(int[] nums, int original) {
int n = nums.length;
Arrays.sort(nums);
for (int i = 0;i< n;i++){
if (original == nums[i]){
original = nums[i];
original *=2;
}
}
return original;
}
}
执行结果
📝T2.5981. 分组得分最高的所有下标
题目
示例
示例1:
输入:nums = [0,0,1,0]
输出:[2,4]
解释:按下标分组
- 0 :numsleft 为 [] 。numsright 为 [0,0,1,0] 。得分为 0 + 1 = 1 。
- 1 :numsleft 为 [0] 。numsright 为 [0,1,0] 。得分为 1 + 1 = 2 。
- 2 :numsleft 为 [0,0] 。numsright 为 [1,0] 。得分为 2 + 1 = 3 。
- 3 :numsleft 为 [0,0,1] 。numsright 为 [0] 。得分为 2 + 0 = 2 。
- 4 :numsleft 为 [0,0,1,0] 。numsright 为 [] 。得分为 3 + 0 = 3 。
下标 2 和 4 都可以得到最高的分组得分 3 。
注意,答案 [4,2] 也被视为正确答案。
示例2:
输入:nums = [0,0,0]
输出:[3]
解释:按下标分组
- 0 :numsleft 为 [] 。numsright 为 [0,0,0] 。得分为 0 + 0 = 0 。
- 1 :numsleft 为 [0] 。numsright 为 [0,0] 。得分为 1 + 0 = 1 。
- 2 :numsleft 为 [0,0] 。numsright 为 [0] 。得分为 2 + 0 = 2 。
- 3 :numsleft 为 [0,0,0] 。numsright 为 [] 。得分为 3 + 0 = 3 。
只有下标 3 可以得到最高的分组得分 3 。
示例3:
输入:nums = [1,1]
输出:[0]
解释:按下标分组
- 0 :numsleft 为 [] 。numsright 为 [1,1] 。得分为 0 + 2 = 2 。
- 1 :numsleft 为 [1] 。numsright 为 [1] 。得分为 0 + 1 = 1 。
- 2 :numsleft 为 [1,1] 。numsright 为 [] 。得分为 0 + 0 = 0 。
只有下标 0 可以得到最高的分组得分 2 。
提示
n == nums.length
1 <= n <= 10^5
nums[i] 为 0 或 1
⭐思路 ⭐
一开始小付拿着题就想着如何快速AC掉 以为是一个简单的暴力 + 哈希表查询 导致了超时,回头一看他喵的给的n是 10 ^5怪不得
。 那就要转换思路或者进行优化进行解题
了。
- 前缀和思想
- 当我们
遍历第一次的时候
,只记录右边的最高得分
- 当我们二次遍历时,需要进行判定左右的得分情况,如果
遇到 0
则左值+1
,反之遇到1右值-1
。 - 同时进行得到
右值
与左值
之后与max值
进行判定
如果当前的最大左右值之和 小于此时左右值之和
,清空列表中数据
,重新设置坐标位置为最大左右值之和的位置下标
。
代码实现
class Solution {
public List<Integer> maxScoreIndices(int[] nums) {
//用于记录当前的最大左右值之和
int max = 0;
//分别记录左右值此时值
int left=0, right=0;
//第一次遍历获取得到 左数组为空 右数组全值的情况
for (int i: nums) {
if (i== 1) {
right++;
}
}
List<Integer> res = new ArrayList<>();
//此时得到的右边全值的值为最大左右值之和的初始值
max = right;
//此时对应的结果下标为0
res.add(0);
//第二次进行遍历
for (int i = 0; i <nums.length; i++) {
//记录当前下标i 大小的左数组的左值 与 n-i 大小的右值
if (nums[i] == 0) {
left++;
} else {
right--;
}
//如果出现了新的最大值则先将之前作为最大值记录的下标清除、再添加
if (max < left + right) {
res.clear();
res.add(i + 1);
max = left + right;
} else if (max == left + right) {
res.add(i + 1);
}
}
return res;
}
}
执行结果
📝T3.5994. 查找给定哈希值的子串
题目
示例
示例1:
输入:s = "leetcode", power = 7, modulo = 20, k = 2, hashValue = 0
输出:"ee"
解释:"ee" 的哈希值为 hash("ee", 7, 20) = (5 * 1 + 5 * 7) mod 20 = 40 mod 20 = 0 。
"ee" 是长度为 2 的第一个哈希值为 0 的子串,所以我们返回 "ee" 。
提示
1 <= k <= s.length <= 2 * 10^4
1 <= power, modulo <= 10^9
0 <= hashValue < modulo
s 只包含小写英文字母。
测试数据保证一定 存在 满足条件的子串。
⭐思路 ⭐
代码实现
class Solution {
public String subStrHash(String s, int power, int modulo, int k, int hashValue) {
char[] str = s.toCharArray();
int n = str.length;
long x = 0, b = 1;
String ans = null;
for (int i = 0; i < k; i++) {
char ch = str[n - 1 - i];
x = (x * power + ch - 'a' + 1) % modulo;
}
for (int i = 0; i < k - 1; i++)
b = b * power % modulo;
if (x == hashValue)
ans = s.substring(n - k);
for (int i = n - k - 1; i >= 0; i--) {
x = (x + modulo - (b * (str[i + k] - 'a' + 1) % modulo)) % modulo;
char ch = str[i];
x = (x * power + ch - 'a' + 1) % modulo;
if (x == hashValue)
ans = s.substring(i, i + k);
}
return ans;
}
}
执行结果
🙊写在最后
小付打卡的第三场周赛 2022-01-30
尽可能把会做的题 都做好 就可以了
本次周赛 对了两道题
同时也了解到了自己的薄弱区域
字符串的相关数据结构与算法的求解
但本次排名有所上升
所以还是很不错的周赛体验
最后
每天进步点 每天收获点
愿诸君 事业有成 学有所获
如果觉得不错 别忘啦一键三连哦~