学习目标:
每天睡前是否感到浑浑噩噩,一天又在不知不觉中过去,回想我今天都干了什么呢?
啊~我这一天又什么也没干,好有罪恶感啊,不行,我明天一定要好好学算法(手动狗头)。
明日复明日,明日何其多?不要等明天啦,和小编一起,每天睡前一道算法题,不仅解决你一天的空虚,更能助你安心入眠,远离熬夜。还能学到一点算法知识。不要小看这些知识哦,不积跬步无以至千里,不积小流无以成江海。每位大佬都不是一夜成名,都是从小白做起,日积月累,终成大佬,和小编一起,每日一题,走向大佬之路吧!
学习内容:
我们的题基本都是一些较为基础,适合日(睡)常(前)看的题,不会让你一眼就看出答案,是稍稍一点脚就能摸到头绪,但是在想的过程中又一时不知如何实现,再一想,又柳暗花明,最终跟着小编的思路一起解决问题,有不同思路可以发在评论区,一起讨论。“你若在,我必回”。
我们今天的内容是二进制与位运算。位运算是对二进制数字进行的运算,所以要理解位运算,首先要只要二进制的相关知识。
二进制 :
二进制,是将数字用0和1表示。我们常用的进制是十进制。1,2,3,4,5,6,7,8,9,10,11...是逢十进一,9之后就到了10,个位清零,十位进一。推广到更多位就是低位(本位)逢十进一,高位(下一位)加一。所以同样的道理,二进制是地位逢二进一,高位加一:000,001,010,011,100,101,110,111。
Q:那么我们如何将二进制转化位十进制?也就是二进制数字表示成我们理解的数是多少呢?
A:二进制表示成十进制,应用的是一种加权求和的方法,每一位的权值是2的n次幂,对于第i位来说,它的权值是2^(i-1)。然后我们将每一位上的数字与他们的权值相乘后相加,得到的就是这个二进制数的十进制值。而对于小数来说,是从小数点后开始,第i位的权值就是2^(-i)。举个栗子🌰:
以上就是我们二进制的基本知识和与十进制的转化。对于其他x进制也是一样,逢x进一,权值是x^i。
位运算:
基本的位运算符号及功能如下:
都是对二进制数字进行操作,对于十进制数计算机会将其转化成对应的二进制再进行操作。
当我们熟悉了他们的功能后,就要开始学习他们的应用。举个栗子🌰:
我们的第一想法一定是用循环暴力求解
int i;
for(i=left;i<=right;i++){
i=i&(i+1);
}
return i;
方法是对的,但是当我们的数据规模较大时,会发生超时,那么我们就需要优化,此时我们需要想到&的特点。只有当数字全都是1时,我们的值才为1。也就是说,只要有0,那么该位的结果就是0,并且他们是连续的一串数,因此我们是不是只要找到他们二进制相同的前缀即可:
最后小编要教大家一个常见题型的“黑科技”,看完后你一定会大呼wc nb。
看完你一定会想,这有什么难的,不就是循环加判断,不断相加嘛。
如果真的是这么简单的话,小编就不会说这么多了(手动狗头)。如果你用刚才的方法,就算快也要写两分钟吧,然后是一大坨的代码。而这也就是优秀的代码和普通的代码间的区别,普通代码写了几十行,而优秀的代码只要一行。虽然有些夸张,但在这个题中是绝对成立的。
接下来谜底揭晓,这一行代码就是 sum=(num-1)%9+1;
想知道原理是什么?小编是一个实用主义者,这个原理的事情不需要我们去理解,我们只要会用即可。真的想知道的话可以自行百度,也很简单。大家记得点赞收藏,防止找不到哦。
欢迎大家订阅小编的每日一题专栏,会每天更新,都是用心准备的哦!
若有不同思路,欢迎评论区留言,看到必回,Goodnight!