「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」
2154. 将找到的值乘以 2
题目
给你一个整数数组 nums ,另给你一个整数 original ,这是需要在 nums 中搜索的第一个数字。
接下来,你需要按下述步骤操作:
如果在 nums 中找到 original ,将 original 乘以 2 ,得到新 original(即,令 original = 2 * original)。 否则,停止这一过程。 只要能在数组中找到新 original ,就对新 original 继续 重复 这一过程。 返回 original 的 最终 值。
示例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 。
题解
哈希表 + 记录每个元素
用哈希表记录 的每个元素,然后不断将 乘 直至其不在哈希表中。
var findFinalValue = function(nums, original) {
const map = [];
nums.forEach(v=>{
map[v] = 1;
})
while(map[original]){
original = original * 2
}
return original
};
2155. 分组得分最高的所有下标
题目
给你一个下标从 0 开始的二进制数组 nums ,数组长度为 n 。nums 可以按下标 i( 0 <= i <= n )拆分成两个数组(可能为空):numsleft 和 numsright 。
numsleft 包含 nums 中从下标 0 到 i - 1 的所有元素(包括 0 和 i - 1 ),而 numsright 包含 nums 中从下标 i 到 n - 1 的所有元素(包括 i 和 n - 1 )。 如果 i == 0 ,numsleft 为 空 ,而 numsright 将包含 nums 中的所有元素。 如果 i == n ,numsleft 将包含 nums 中的所有元素,而 numsright 为 空 。 下标 i 的 分组得分 为 numsleft 中 0 的个数和 numsright 中 1 的个数之 和 。
返回 分组得分 最高 的 所有不同下标 。你可以按 任意顺序 返回答案。
示例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 。
题解
简单模拟
题目中已知:下标 i 的 分组得分 为 numsleft 中 0 的个数和 numsright 中 1 的个数之 和
- 第1次枚举,得到1的数量放入 中
- 用变量 记录 0 的数量
- 第2次枚举,从左到右,遇0时 ,遇1时
- 记录 最大值
- 记录每个 的个数
- 返回
var maxScoreIndices = function (nums) {
let one = 0
const len = nums.length
for (let i = 0; i < len; i++) {
if (nums[i] === 1) one++
}
let map = {}
let max = one
map[one] = [0]
let zero = 0
for (let i = 1; i <= len; i++) {
if (nums[i - 1] === 0) zero++
if (nums[i - 1] === 1) one--
const k = zero + one
max = Math.max(max, k)
if (map[k] === undefined) {
map[k] = [i]
} else {
map[k].push(i)
}
}
return map[max]
}
优化
进一步优化,省略哈希变量 变量 是递增的,题目要求只取分组得分最高,如果增加,之前存储在 中的数据就之需要删除重新存放即可。
var maxScoreIndices = function (nums) {
let one = 0
const len = nums.length
for (let i = 0; i < len; i++) {
if (nums[i] === 1) one++
}
let max = one
let zero = 0
let result = [0]
for (let i = 1; i <= len; i++) {
if (nums[i - 1] === 0) zero++
if (nums[i - 1] === 1) one--
const k = zero + one
if( k > max){
max = k;
result = [i]
}else if(k === max){
result.push(i)
}
}
return result
}