给一个正整数,现在牛牛想得到一个不可重集合(该集合的元素不能重复),不重复地利用这个集合中的数进行加和可以表示出的所有数。牛牛想知道这个集合大小的最小值为多少?
例如 的时候答案为,所需要的集合为。
其中 的表示方法如下:
注意:在表示一个数时,集合中的元素不能重复使用。例如这是不符合要求的表示方法。
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 返回集合大小的最小值 * @param n long长整型 * @return int整型 */ int getSize(long long n) { // write code here long long count = 1; int size = 0; do{ n -= count; count <<= 1; size++; }while(n > 0); return size; } };投机取巧这么就过了,但实际上我们可以通过二进制来思考这件事,只要能把n的每个位表示完就行了,需要的不重复数字个数就是n表示为二进制的长度。
class Solution: def getSize(self , n ): return len(bin(n)) - 2
class Solution: def getSize(self , n ): # write code here if (n==1&nbs***bsp;n==2): return 1 else: for i in range(n): num = 2**i - 1 if num>=n: return i break可以发现规律,当n小于等于时,输出的结果就是k