Top 100 Linked Question 修炼------第338题

2024-01-02 17:18

本文主要是介绍Top 100 Linked Question 修炼------第338题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

338. Counting Bits

题目链接

题目解释:给出一个非负整数num.对于每个数字i而言,计算从0~num中每个数字在二进制中包含1的个数。最后的结果通过数组返回。

Example 1:

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

Example 2:

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

Follow up:

  • 很自然的想到时间复杂度为O(n*sizeof(integer))的方案。但是你能在一次遍历,线性时间内完成么?
  • 空间复杂度应该为O(n)
  • 你能像老板一样做么?不能使用类似于c++中的内置函数 __builtin_popcount,或者其他语言的内置函数。

题目分析:首先拿到这个题的时候,我们最直观的想法就是采用取余的方式来进行操作,然后对每个num都进行一次调用即可。但是最后题目有了个follow up.这个方案就pass掉了。但是,也给出这个方案的解题方式,毕竟能接出问题就是王道:
 

class Solution:def countBits(self, num):""":param num::return:"""ans=[]for i in range(0,num+1):ans.append(self.change2bit(i))return ansdef change2bit(self,num):res=[]while True:tmp=num%2res.insert(0,tmp)num=num//2if num==0:breakreturn collections.Counter(res)[1]

平常见得最多的方式就是上面这种解题方式,这种方式对于单个求值问题来说是很方便的。

既然这种方法不行,而这题又是考察某个数转换为二进制后1的个数,那么可不可以直接采用 bit operation来完成这样的操作呢?

很显然,本题的直接思想就是需要我们采用Bit operation来完成操作。想想一下,我们那8421来举例子,

对于某个具体的数,若它是偶数,如6,那么其二进制位0110,是不是和3的二进制1一样多。3的二进制位为:0011.这个规律可以一直持续下去。若它是奇数,如7,其二进制为0111,对应的,7/2=3,所以7的二进制中1的个数等于3的二进制中1的个数+1.

通过验证发现,这样的规律是普遍存在的,那么我们可以按照这个规律去解答问题:

PS:很显然,这是个好的解题方案。这个结论也是个好结论,记住就ok了。

下面就是很直观的代码过程:

    def countBits(self,num):res = [0]for i in range(1, num + 1):# 如果i是偶数的话1的个数是和i/2一样多的。如果i是奇数的话,1的个数比i/2多1个。res.append(res[i >> 1] + (i % 1))return res

Reference

https://leetcode.com/problems/counting-bits/discuss/79544/Python-solution

总结

2019/6/27:有的时候,总会感叹,别人的思路怎么这么巧妙,原来是见得多了,思路也就宽广了。

这篇关于Top 100 Linked Question 修炼------第338题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/563135

相关文章

KLayout ------ 旋转物体90度并做平移

KLayout ------ 旋转创建的物体 正文 正文 前段时间,有个小伙伴留言问我,KLayout 中如何旋转自己创建的物体,这里特来说明一下。 import pyapoly = pya.DPolygon([pya.DPoint(0, 0), pya.DPoint(0, 5), pya

算法10—海量数据处理之top k算法

第一部分:Top K 算法详解 问题描述 百度面试题:     搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。     假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。

sql之top用法

TOP 子句 TOP 子句用于规定要返回的记录的数目。 对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。 注释: 并非所有的数据库系统都支持 TOP 子句。 SQL Server 的语法: SELECT TOP number|percent column_name(s)FROM table_name MySQL 和 Oracle 中的 SQL SELECT TOP 是等价的 M

求13x+12y=100;x+45=90的解,找到一个满足的解就行(break跳出循环)

#include<stdio.h>#include<stdlib.h>//break语句不能用在循环语句和switch语句之外的语句int main(){//x>0,y>0 ,求:x,y 且是整数 //13x+12y=100:即13i+12j=100,即12j=100-13ifor(int i=0;i<100;i++){printf("%d\n",i);if((100-13*i)%12==

oracle创建一个带参数的存储过程:为指定的员工,涨100块钱的工资;并且打印涨前和涨后的薪水

--创建一个带参数的存储过程--为指定的员工,涨100块钱的工资;并且打印涨前和涨后的薪水/*beginraisesalary(6755);raisesalary(4456);commit();//这里提交,所以说我们一般不会在存储过程或者存储函数中写提交,end;/*/--host cls--先创建表emp和插入数据,显示表的结构用desc 表名--create table empcr

面向对象修炼手册(三)(行为与多态)(Java宝典)

​ 🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀面向对象修炼手册 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光  目录 前言 行为 1 静态行为和动态行为 1.1 静态类和动态类 1.2 静态方法与动态方法 1.2.1  静态方法与动态方法区别 1.2.2  静态方法与动态方法的优缺点 1.2.3  静态方法与动态方

Python-算法编程100例-前缀和双指针(入门级)-最长的指定瑕疵度的元音子串

题目描述: 元音字符为“aeiouAEIOU” 给定一个字符串,求字符串中满足指定瑕疵度的最长元音子串的长度。元音子串为字符串中开头和结尾都是元音字符的字符串,瑕疵度为子串中非元音字符的个数。 题目分析: 1、直接使用双指针,难度稍微有些大,边界不好处理。 2、使用前缀和+双指针,题目难度简化。 瑕疵度k=0原始字符串asdbuiodevauufgh元音字符到起始位置的瑕疵度00003

#define用法,避免重复------笛风读书笔记系列

读书笔记系列之:#define用法,避免重复                                                                               笛风                                                                               2013.10.11

警惕!最新17本期刊(含2本Top)被“镇压”,无影响因子无分区,这是被踢了吗?

本周投稿推荐 SSCI • 中科院2区,6.0-7.0(录用友好) EI • 各领域沾边均可(2天录用) CNKI • 7天录用-检索(急录友好) SCI&EI • 4区生物医学类,0.5-1.0(录用率99%) • 1区工程类,6.0-7.0(进展超顺) • IEEE(TOP),7.5-8.0(实力强刊) 本期解析 1、2023JCR于昨天已经正式发布,其中有17本期

【Linux 杂记】TOP命令

top命令用于动态显示系统中正在运行的进程的详细信息,以及系统的整体资源使用情况。以下是其主要输出解释: Header 表头信息: top:当前时间和运行时间。Tasks:进程统计信息,如总进程数、运行中、睡眠中等。CPU(s):CPU使用情况,包括总体利用率和每个CPU核心的使用率。Mem:内存使用情况,包括总内存、已使用、空闲、缓存等。Swap:交换空间使用情况,类似free命令的输出。