1. 程式人生 > >LeetCode 338.Counting Bits題解

LeetCode 338.Counting Bits題解

題目描述

題目連結
題目主要意思是輸入一個非負數,讓你計算從0開始到這個數相應的二進位制數中有多少個1。最後返回一個數組,比如輸入5,返回[0,1,1,2,1,2]分別對應0、1、10、11、100、101。
其實題目描述很簡單,但是後面有要求我們用O(n)的時間複雜度來解決這個問題。

思路一

先將每個數字轉化成二進位制數,然後一位一位的判斷是否為1。很顯然這個方法能夠解決問題,但是時間複雜度並不滿足要求。

思路二

觀察各個數之間的聯絡,得出關係式:
relation
我們可以看到,通過劃分步長可以得到數字之間的聯絡。很明顯,

  • oneNum[1] = oneNum[0] + 1
  • oneNum[7] = oneNum[7 - 2^2] + 1
  • oneNum[8] = oneNum[8 - 2^3] + 1

因此,我們只要初始化neNum[0] = 0,即可通過步長推算出相應的數。這個步長應該是2的n次方,通過簡單的while迴圈我們就可以判斷移動步長。

Java實現

其實這道題並沒有使用什麼特別的語言特性,要說有的話可能就是用了Math類吧,方便我做開方運算,整體思路各個語言應該都差不多。

public class Solution {
    public int[] countBits(int num) {
        //儲存各個位置1的個數
        int[] oneNum = new int[num+1
]; oneNum[0] = 0;//初始值 for(int i = 1; i <= num; i++){ int shiftNum = getShiftNum(i);//每個數的偏移量不同 oneNum[i] = oneNum[i - shiftNum] + 1; } return oneNum; } //獲取偏移量 int getShiftNum(int num) { int indexNum = 0; while(Math.pow(2
, indexNum + 1) <= num){ indexNum++; } return (int) Math.pow(2, indexNum); } public static void main(String[] args) { Solution s = new Solution(); int num[] = s.countBits(2); for (int i : num) { System.out.println(i + " "); } } }

相關推薦

LeetCode 338.Counting Bits題解

題目描述 題目連結 題目主要意思是輸入一個非負數,讓你計算從0開始到這個數相應的二進位制數中有多少個1。最後返回一個數組,比如輸入5,返回[0,1,1,2,1,2]分別對應0、1、10、11、100、101。 其實題目描述很簡單,但是後面有要求我們用O(n

[leetcode-338-Counting Bits]

single binary problem href present gen process Coding [1] Given a non negative integer number num. For every numbers i in the range 0 ≤ i

[Leetcode] 338. Counting Bits

div number ace ever lex ould sub line lang Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calcula

LeetCode 338. Counting Bits

com ecif i++ one div new style decimal span 位運算 x&x-1 zero out the least significant 1 The first solution is to use the popCount meth

Leetcode 338 Counting Bits

題目描述: 給一個非負整數n,分別求0到n的n+1個整數的二進位制表示中1的個數,結果作為陣列輸出。 這個題目可以說很簡單,無非就是每個數求一下二進位制表示中1的個數,然後放到返回的數組裡。求二進位制1的位數雖然說五花八門,但是相比於資料規模n來說,都是常量時間,對於

LeetCode 338. Counting Bits(計算二進位制數中1的位數)

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 repre

LeetCode 338. Counting Bits

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 r

leetcode 338 Counting Bits python3 多種(最簡)解法,尋求數學規律

”’ Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate t

LeetCode-338. Counting Bits

turn ava n) java represent pan alc out 復雜 Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num cal

Leetcode 338. Counting Bits.md

str using eof for public 進制 opc present should 題目 鏈接:https://leetcode.com/problems/counting-bits Level: Medium Discription: Given a non

LeetCode338. Counting Bits

class Solution: # 遍歷 def countBits(self, num): """ :type num: int :

LeetCode刷題338. Counting Bits

題目描述: 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 r

Leet Code OJ 338. Counting Bits [Difficulty: Medium]

down con 方案 medium ret 元素 addclass word tty 題目: Given a non negative integer number num. For every numbers i in the range 0 ≤

338. Counting Bits (Medium)

present lan medium ++ eve type binary amp Language Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num

338. Counting Bits

ref emc bits target www get mcs userinfo www. 54s97K9釋GWM曰http://weibo.com/u/5848225206 Z滌凸菏3JZP鼻39http://shequ.docin.com/sina_626720001

338. Counting Bits(python+cpp)

題目: 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 repr

DP專題8 - leetcode354. Russian Doll Envelopes/338. Counting Bits

354. Russian Doll Envelopes 題目描述 有許多給定長寬(w, h)的信封。當且僅當當前信封的長寬都大於另一個的時,才可以把另一個信封放入當前信封中。(不允許翻轉信封) 問:你可以套的最大信封數? 例子 Input: [[5,

LC 338. Counting Bits

1.題目描述 338. Counting Bits Medium 101773 Given a non negative integer number num. For every numbers i in the range 0 ≤

LeetCode 190. Reverse Bits 題解

 先給出最先想到的解法,java程式碼如下: public class Solution { public int reverseBits(int n) { // 將整數轉為二進位制 String binaryString = Int

338. 位元位計數 Counting Bits

給定一個非負整數 num。對於 0 ≤ i ≤ num 範圍中的每個數字 i ,計算其二進位制數中的 1 的數目並將它們作為陣列返回。 示例 1: 輸入: 2 輸出: [0,1,1] 示例 2: 輸入: 5 輸出: [0,1,1,2,1,2] 進階: 給出時間複雜