原题:力扣2154 难度:easy
题目描述:
给你一个整数数组 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 。
分析题目:题目的意思还是比较清晰的,第一轮先找到数组元素为original的数,如果能找到这个数,就乘2再去下一轮重复上述操作直到找不到返回当前original的值,当然如果第一轮就找不到也是直接返回的。这里不难发现original的值会改变,所以需要一个变量记住original变化之前的数是多少,并且可以用这个变量来分析是否找到original还是没找到目标值。
我们来看一下代码的书写和分析:
我们可以定义一个变量记住最开始original的值:
int count = original;
我们先写一轮查找是怎么样的,先遍历整个数组元素查找有没有目标值original,重点是后面的设计,如果找到的话,我们要更新当前的original的值变成2倍,然后跳出这一层for循环:
for(int i = 0;i < numsSize;i++){
if(nums[i] == original){
original = original * 2;
break;
}
}
我们可以用最开始记录的count来和original比较,如果值不一样肯定是找到了,所以还要再进行一次查找,如果没找到就跳出查找返回当前original值即可,所以这整个是一个很多次的循环,可以放进while中进行处理,那么最后的代码结果就是如下:
int findFinalValue(int* nums, int numsSize, int original){
int count = original;
while(1 == 1){
for(int i = 0;i < numsSize;i++){
if(nums[i] == original){
original = original * 2;
break;
}
}
if(count == original){
break;
}else{
count = original;
}
}
return original;
}
那么这一次的算法学习就结束了,我们再下一章节再会。