zoukankan      html  css  js  c++  java
  • [Swift]LeetCode338. 比特位计数 | Counting Bits

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10262072.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1's in their binary representation and return them as an array.

    Example 1:

    Input: 2
    Output: [0,1,1]

    Example 2:

    Input: 5
    Output: [0,1,1,2,1,2]
    

    Follow up:

    • It is very easy to come up with a solution with run time O(n*sizeof(integer)). But can you do it in linear time O(n)/possibly in a single pass?
    • Space complexity should be O(n).
    • Can you do it like a boss? Do it without using any builtin function like __builtin_popcount in c++ or in any other language.

    给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。

    示例 1:

    输入: 2
    输出: [0,1,1]

    示例 2:

    输入: 5
    输出: [0,1,1,2,1,2]

    进阶:

    • 给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗?
    • 要求算法的空间复杂度为O(n)。
    • 你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的 __builtin_popcount)来执行此操作。

    36ms

     1 class Solution {
     2     func countBits(_ num: Int) -> [Int] {
     3         guard num > 0 else {
     4             return [0]
     5         }
     6         
     7         var result = [0]
     8         var i = 0
     9         var total = 1
    10         
    11         for j in 1...num {
    12             result.append(result[i] + 1)
    13             i += 1
    14             if i == total {
    15                 i = 0
    16                 total = j + 1
    17             }
    18         }
    19         return result
    20     }
    21 }

    40ms

     1 class Solution {
     2     func countBits(_ num: Int) -> [Int] {
     3         if num == 0 {
     4             return [0]
     5         }
     6         var results = [Int]()
     7         results.append(0)
     8         for n in 1...num {
     9             if n%2 == 1 {
    10                 results.append(results[n-1]+1)
    11             } else {
    12                 results.append(results[n/2])
    13             }
    14         }
    15         return results
    16     }
    17 }

    44ms

     1 class Solution {
     2     func countBits(_ num: Int) -> [Int] {
     3         guard num > 0 else {
     4             return [0]
     5         }
     6 
     7         var result = Array(repeating: 0, count: num + 1)
     8         result[1] = 1
     9         var loopCount = 2
    10         var index = 2
    11         while index <= num {
    12             for j in 0..<loopCount {
    13                 if index > num {
    14                     break
    15                 }
    16 
    17                 result[index] = 1 + result[j]
    18                 index += 1
    19             }
    20 
    21             loopCount *= 2
    22         }
    23         return result
    24     }
    25 }

    48ms

     1 class Solution {
     2     func countBits(_ num: Int) -> [Int] {
     3         var a = [0]
     4         var b = [Int]()
     5         while (a.count + b.count) != num+1 {
     6             if a.count == b.count{
     7                 a = a + b
     8                 b = [Int]()
     9             }
    10             b.append(a[b.count]+1)
    11         }
    12         return a + b
    13     }
    14 }

    88ms

     1 class Solution {
     2     func countBits(_ num: Int) -> [Int] {
     3         guard num > 0 else { return [0] }
     4         var dp = [Int](repeating: 0, count: num + 1)
     5         
     6         for i in 1...num {
     7             dp[i] = dp[i & (i - 1)] + 1
     8         }
     9         return dp
    10     }
    11 }

    108ms

     1 class Solution {
     2     func countBits(_ num: Int) -> [Int] {
     3         var result = [Int]()
     4         if num < 0 {
     5             return result
     6         }
     7         result.append(0)
     8         if num == 0 {
     9             return result
    10         }
    11         for i in 1 ... num {
    12             print(i & 1)
    13             result.append(result[i >> 1] + (i & 1))
    14         }
    15         return result
    16     }
    17 }

    112ms

     1 class Solution {
     2     func countBits(_ num: Int) -> [Int] {       
     3         if num == 0 { return [0] }
     4         var result = [0]
     5         var count = 1
     6         while true {
     7             for j in 0 ..< count {
     8                 result.append(result[j] + 1)    
     9                 if result.count == num + 1 {
    10                     return result
    11                 }
    12             }
    13             count = result.count
    14         }
    15         return result
    16         
    17     }
    18 }

    116ms

     1 class Solution {
     2     func countBits(_ num: Int) -> [Int] {
     3         if num == 0 {
     4             return [0]
     5         }
     6         var res = [Int].init()
     7         res.append(0)
     8         for n in 1...num {
     9             let count = res[n & (n - 1)] + 1
    10             res.append(count)
    11         }
    12         return res
    13     }
    14 }

    164ms

     1 class Solution {
     2     func countBits(_ num: Int) -> [Int] {
     3         var b = [Int](repeating: 0, count: num + 1)
     4         if num == 0 { return [0] }
     5         if num == 1 { return [0,1] }
     6         for i in 1...num {
     7             b[i] = b[i >> 1] + i % 2
     8         }
     9         return b
    10     }
    11 }

    176ms

     1 class Solution {
     2     func countBits(_ num: Int) -> [Int]
     3     {
     4         var res = [Int]()
     5         for i in 0...num
     6         {
     7             var n = i
     8             var count = 0
     9             while n > 0
    10             {
    11                 if n&1 == 1
    12                 {
    13                     count += 1
    14                 }
    15                 n = n >> 1
    16             }
    17             res.append(count)
    18         }
    19         return res
    20     }
    21 }

    156ms

     1 class Solution {
     2     func countBits(_ num: Int) -> [Int] {
     3         guard num > 0 else { return [0] }
     4         var dp = [Int](repeating: 0, count: num + 1)
     5         
     6         for i in 1...num {
     7             dp[i] = dp[i / 2]
     8             if i % 2 == 1 {
     9                 dp[i] += 1
    10             }
    11         }
    12         return dp
    13     }
    14 }
  • 相关阅读:
    数字和字母交替打印
    日期和字符串的转化
    redis简介
    管理MySQL的命令
    创建mysql数据表成功
    微信账号 echo_server 的实现
    html5 画个圈
    php练习1
    人生十大点
    养生“六伤”、“十二莫”、“十二少”
  • 原文地址:https://www.cnblogs.com/strengthen/p/10262072.html
Copyright © 2011-2022 走看看