力扣每日一题(三十九——将数字变成0的操作次数)

仅以此纪录每日LeetCode所刷题目(今天除夕,祝大家春节快乐。这次的题目是今日的每日一题和上周周赛做出来的两道题)。

题目描述:

 力扣每日一题(三十九——将数字变成0的操作次数)_第1张图片

示例:

力扣每日一题(三十九——将数字变成0的操作次数)_第2张图片

思路:

我这道题直接使用模拟方法,根据题目给出的方法,对奇数和偶数分别进行处理,直到num为0时停止循环,进行输出。

代码:

class Solution:
    def numberOfSteps(self, num: int) -> int:
        count = 0
        while num != 0:
            if num % 2 == 0:
                num = int(num/2)
                count += 1
            else:
                num -= 1
                count += 1
        return count

 题目描述:

力扣每日一题(三十九——将数字变成0的操作次数)_第3张图片

示例:

力扣每日一题(三十九——将数字变成0的操作次数)_第4张图片

思路:

这道题我首先将数组进行从小到大的排序,因为数是不断翻倍的,从小到大的排序正好符合翻倍的顺序,之后进行循环,找到最大的翻倍数。 

代码:

class Solution:
    def findFinalValue(self, nums: List[int], original: int) -> int:
        nums = sorted(nums)
        for i in nums:
            if i == original:
                original = original*2
        return original

 题目描述:

力扣每日一题(三十九——将数字变成0的操作次数)_第5张图片

示例:

力扣每日一题(三十九——将数字变成0的操作次数)_第6张图片

思路:

这道题如果使用多次循环,会超时。我首先将数组中1的个数数出来(为得分值),因为一开始nums左为空,nums右为nums数组。之后我们进行移动,当这个数为0时,分值加一;当这个数为1时,分值减一。这样的话我们可以把所有下标所对应的分值都求出来,因为要求最大分值,查找问题我们使用哈希表存储。这样我们将分值作为key值,下标作为value值。之后我们将keys进行排序,找出最大的key,之后返回相对应的values值。

代码:

class Solution:
    def maxScoreIndices(self, nums: List[int]) -> List[int]:
        a = 0
        for i in nums:
            if i == 1:
                a += 1
        dict1 = {a:[0]}
        for i in range(len(nums)):
            if nums[i] == 0:
                a += 1
            else:
                a -= 1
            if a in dict1:
                dict1[a].append(i+1)
            else:
                dict1[a] = [i+1]
        b = sorted(dict1.keys())
        return dict1[b[-1]]

你可能感兴趣的:(LeetCode刷题,leetcode,算法,职场和发展)