算法题每日一练---第103天:目标值*2

584 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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; 
    }
};

五、测试结果

1.png

2.png

第二种排序法,执行用时更短一点。

19.png