首页 > 其他分享 >剑指 Offer II 003. 前 n 个数字二进制中 1 的个数

剑指 Offer II 003. 前 n 个数字二进制中 1 的个数

时间:2022-12-20 16:23:07浏览次数:50  
标签:countBits II return 编码 二进制 Offer list 003 append

题目内容

给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。
说明 :0 <= n <= 105

解题思路1

直接运用内置函数bin()count()将从0 到 n的数转化为二进制的字符串,并且统计其中的 1 的个数,记录在列表中。

class Solution(object):
def countBits(self, n):
    list = []
    for x in range(n+1):
        str = bin(x)[2:]
        list.append(str.count('1'))
    return list

解题思路2

运用二进制编码的规律
遮住编码的最高位,可以发现剩余位数编码变化规律和之前的1~n-1位编码规律相同。设当前二进制数x最高位大小为p(1、2、4...) ,则list[x] = list[x - p] + 1。

 class Solution(object):
 def countBits(n):
    list=[0]
    p = 1
    x = 1
    while x <= n:
        q = p << 1
        while x < q :
            list.append(list[x-p] + 1)
            x +=1
            if x > n: break
        p = q
    return list

解题思路3

进一步寻找更简化的改进二进制编码的规律。如果x是奇数,则其list[x] = list[x >> 1] + 1;如果x是偶数,list[x] = list[x >> 1]。

class Solution(object):
def countBits(self, n):
    list = [0]
    for x in range(1, n+1):
       list.append(list[x >> 1] + x % 2)
    return list

Python

  • append()将对象加入到列表末尾,在加入前要先定义列表list = []。

标签:countBits,II,return,编码,二进制,Offer,list,003,append
From: https://www.cnblogs.com/tree123/p/16994474.html

相关文章

  • 1003.模板变量及模板过滤器
    一、模板路径总结1.DIRS定义一个目录列表,模板引擎按列表顺序搜索这些目录以查找模板源文件。将templates放在主项目目录下;2.APP_DIRS告诉模板引擎是否应该进入每个已安......
  • pgpool_II节点状态问题(pgpool_status)
    环境:OS:Centos7PG:14pgpool:4.4通过vip登录发现主节点状态一直是down,重启该节点的pgpool_II也没有用[postgres@pg2pgpool-II]$psql-h192.168.1.199-p9999-Up......
  • Codeforces Round #840 (Div. 2) and Enigma 2022 - Cybros LNMIIT AB
    (:我一开始以为我要爆0了,跌,磕磕绊绊,还好写出了这两题,后面的太难了题目都没看hhhttps://codeforces.com/contest/1763A.AbsoluteMaximization题目大意:给定一个数组a,我......
  • 剑指offer 数字在排序数组中出现的次数(C++)
    题目描述统计一个数字在排序数组中出现的次数。代码实现classSolution{public:intGetNumberOfK(vector<int>data,intk){if(data.empty())re......
  • 剑指offer 二叉树的深度(C++)
    题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。代码实现/*structTreeNode{intval;......
  • 剑指offer 字符串的排列(C++)
    题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:......
  • 剑指offer 二叉树的镜像(C++)
    问题描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树8/\610/\/\57911镜像二叉树......
  • 剑指offer 题解目录(C++)
    序号题目知识点难度1​​二维数组中的查找​数组查找较难2​​替换空格​字符串较难3​​从尾到头打印链表​链表较难4​​重建二叉树​树中等5​​用两个栈实现队列......
  • iis netcore 设置跨域后 httpDelete 不起作用
    web.configxml<system.webServer><modulesrunAllManagedModulesForAllRequests="false"><removename="WebDAVModule"/></modules></system.webServer>......
  • 老男孩教育 | 98年0基础转行,三个月时间,收获满意Offer!
    没有好学历,也没有一技之长,该如何实现人生逆袭?其实想要逆袭成功并不是一件困难的事情,难的是走向成功的过程,无论你是否有学历、是否有一技之长,只要不敢于平庸你也可......