###### tags: `leetcode` # LeetCode #338 Counting Bits - Solution by CharlieHe > ref = https://leetcode.com/problems/counting-bits/discuss/332666/100-ms-faster-than-99.06-memory-Usage-less-than-97.01-of-Python3 ## CharlieHe's ```python= class Solution: def countBits(self, num: int) -> List[int]: _num = num res = [0] while _num >= 1: res += list(map(lambda x: x+1, res)) _num //= 2 return res[:num+1] ``` ### `list()`, eating iterator, returning list > ref = https://www.programiz.com/python-programming/methods/built-in/list * Create list from sequence: string, tuple and list. * Create list from collection: set and dictionary * Create list from custom iterator object ### a list `+` another list Append one list to another. ```python= [0, 1, 2, 3, 4] + [5, 6, 7, 8, 9] ``` ```python= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] ``` ### `map()`, returning iterator > ref = http://www.runoob.com/python/python-func-map.html >> Note that map() in Python2 returns a list A `map()` takes a function and iterable sequence. ```python an_iterator = map(function, iterable_sequence_0, iterable_sequence_1, ...) ``` A `map()` returns an *iterator* (a kind of *generator*), in Python3. ```python= in [1]: map(lambda x: x ** 2, [1, 2, 3, 4, 5]) Out[1]: <map at 0x7f3b01850c18> ``` #### *Iterator* in Python 3 > ref = http://zetcode.com/lang/python/itergener/ In this part of the Python tutorial, we work with interators and generators. Iterator is an object which allows a programmer to traverse through all the elements of a collection, regardless of its specific implementation. In Python, an iterator is an object which implements the iterator protocol. The iterator protocol consists of two methods. The __iter__() method, which must return the iterator object, and the next() method, which returns the next element from a sequence. Iterators have several advantages: - Cleaner code - Iterators can work with infinite sequences - Iterators save resources ## york's thinking I approach is: - find the next $2^p-1$ - do the doubling $p$ times - take the first $n$ elements The next $2^p-1$ is the lg(floor()) I was thinking to find $2^p-1$ by $2^p-1 = 2^{floor[lg(n+1)]}-1$ Since Python doesn't have a build-in log(), I was thinking about to find $2^p-1 = 2^{floor[lg(n+1)]}-1$ by bitwise operation. But CharlieHe