LeetCode:268. 丢失的数字1404. 将二进制表示减到 1 的步骤数

Posted 南岸青栀*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode:268. 丢失的数字1404. 将二进制表示减到 1 的步骤数相关的知识,希望对你有一定的参考价值。

268. 丢失的数字

在这里插入图片描述
在这里插入图片描述

法1:遍历寻找

class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        for i in range(len(nums)+1):
            if i not in nums: return i

法2:哈希表

class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        cur = set(nums)
        for i in range(len(nums)+1):
            if i not in cur: return i

法3:数学

class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        return len(nums)*(len(nums)+1)//2 - sum(nums)

法4:位运算

由于异或运算(XOR)满足结合律,并且对一个数进行两次完全相同的异或运算会得到原来的数,因此我们可以通过异或运算找到缺失的数字。

算法

我们知道数组中有 n 个数,并且缺失的数在 [0…n][0…n] 中。因此我们可以先得到 [0…n][0…n] 的异或值,再将结果对数组中的每一个数进行一次异或运算。未缺失的数在 [0…n][0…n] 和数组中各出现一次,因此异或后得到 0。而缺失的数字只在 [0…n][0…n] 中出现了一次,在数组中没有出现,因此最终的异或结果即为这个缺失的数字。

在编写代码时,由于 [0…n][0…n] 恰好是这个数组的下标加上 nn,因此可以用一次循环完成所有的异或运算,例如下面这个例子:

下标 0 1 2 3
数字 0 1 3 4
可以将结果的初始值设为 nn,再对数组中的每一个数以及它的下标进行一个异或运算,即:

miss = 4∧(0∧0)∧(1∧1)∧(2∧3)∧(3∧4)
=(4∧4)∧(0∧0)∧(1∧1)∧(3∧3)∧2
=0∧0∧0∧0∧2
=2

就得到了缺失的数字为 2。

class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        #位运算
        miss = len(nums)
        for i in range(len(nums)):
            miss = miss^i^nums[i]
        return miss

1404. 将二进制表示减到 1 的步骤数

在这里插入图片描述

思路1:

class Solution:
    def numSteps(self, s: str) -> int:
        #字符串转为2进制下的十进制
        s = int(s,2)
        cnt = 0
        while s > 1:
            #判断最后一位是否为1,不管结果如何都算一步
            if s&1 == 1:
                s += 1
            elif s&1 == 0:
                s = s>>1
            cnt += 1
        return cnt

思路2:总结归纳

class Solution:
    def numSteps(self, s: str) -> int:
        #特殊情况只是开头有1
        if s[1::].count("0") == len(s)-1: return len(s)-1
        """
        1.一定会进行移位,所以次数为len(s)-1
        2.因为偶数才会直接除,当第一次遇见1时会进行2次操作
        3.在第一个和最后一个1之间的0,会因为进位而进行两次操作,所以统计第一个1和第二个1之间的0的个数 zero
        最后结果 cnt = len(s)-1+2+zero = len(s)+1+zero
        """
        cnt = len(s) + 1
        for i in range(len(s)):
            if "1" not in s[i+1::]: break      
        return cnt + s[:i].count("0")

以上是关于LeetCode:268. 丢失的数字1404. 将二进制表示减到 1 的步骤数的主要内容,如果未能解决你的问题,请参考以下文章

数学与数字6:LeetCode268. 丢失的数字

LeetCode 268 丢失的数字[二分法 异或] HERODING的LeetCode之路

leetcode268 缺失数字(Easy)

Leetcode 268.缺失数字 By Python

LeetCode 268. Missing Number (缺失的数字)

[LeetCode] 268. Missing Number 缺失的数字