持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
一、问题描述
给你一个整数数组 nums
,另给你一个整数 original
,这是需要在 nums
中搜索的第一个数字。
接下来,你需要按下述步骤操作:
如果在 nums
中找到 original
,将 original
乘以 2 ,得到新 original
(即,令 original
= 2 * original
)。 否则,停止这一过程。 只要能在数组中找到新 original ,就对新 original 继续 重复 这一过程。 返回 original
的 最终 值。
题目链接:目标值*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.简单模拟、哈希、排序
2.建议用时10~25min
复制代码
三、问题分析
这一题主要想到了两种做法,第一种直接哈希排序判断,第二种排序判断。
1.哈希
首先,我们将数据存储到哈希表中,为了后面查询判断。
定义while循环,一直寻找在哈希表中的original
是否存在,如果存在*2继续遍历,不存在直接输出结果。
2.排序
我们先将数据从小到大排序,按照顺序遍历是否存在元素和original
相等,如何存在*2继续向后遍历,不需要从头再来。这里还要注意一点:当original
大于数组元素的最大值时,此时不需要向后遍历,直接输出结果就行。
四、编码实现
1.哈希
class Solution {
public:
int findFinalValue(vector<int>& nums, int original) {
int i,n=nums.size();
map<int,int>m;
for(i=0;i<n;i++) m[nums[i]]++;
while(m[original]!=0) original=original*2;
return original;
}
};
复制代码
2.排序
class Solution {
public:
int findFinalValue(vector<int>& nums, int original) {
int i,n=nums.size();
sort(nums.begin(),nums.end());
for(i=0;i<n;i++)
{
if(original==nums[i])
original=original*2;
if(original>nums[n-1])
return original;
}
return original;
}
};
复制代码
五、测试结果
第二种排序法,执行用时更短一点。