
楔子
大家好,我是张桃狮。
我在单位办公用的电脑是DELL Vostro小主机,通过网线连接到公司的局域网使用。
最近我换了一个办公工位,新工位电脑连接网线不太方便,不过我发现这台小主机是有无线网卡的,就打算通过wifi上网。
结果我发现搜不到wifi信号。
确切的说是搜不到公司的wifi信号,其他不相干的wifi信号倒是搜到一堆。
这就很奇怪了。
公司局域网的路由器是不久前新买的,支持5G WiFi和2.4G WiFi,在我的手机上可以看到这两个wifi信号,不可能出现隐藏SSID的情况。
打开设备管理器,我看到小主机的无线网卡型号是Qualcomm QCA9565 802.11b/g/n Wireless Adapter。
上网查了一下,这个无线网卡是支持2.4G WiFi的。
这个无线网卡虽然老了点,不支持5G WiFi,但是为什么2.4G WiFi也搜不到呢?
下面是解决方法。
打开WIN10右下角的WLAN界面,拖动wifi信号名称右边的进度条到底,可以看到隐藏的网络。
点击隐藏的网络,输入SSID(就是手机上可以看的wifi信号名称),再输入密码就可以访问了。
注意我输入的是2.4G WiFi的名称,这个无线网卡只支持2.4G WiFi。
问题解决了,但是为什么会这样?我还没有搞明白。
咱们闲话讲完,继续力扣刷题学编程。
我刷题不是为了面试或者参加竞赛,只是为了熟悉python语法,所以我做的都是标记为easy的题目。
感兴趣的,可以关注我,大家一起学习。
力扣231. 2 的幂
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == ,则认为 n 是 2 的幂次方。
示例 1:
输入:n = 1
输出:true
解释:20 = 1
示例 2:
输入:n = 16
输出:true
解释:24 = 16
示例 3:
输入:n = 3
输出:false
提示:
- <= n <= - 1
进阶:你能够不使用循环/递归解决此问题吗?
我的思路
先用循环做一版,再挑战用位运算。
循环
class Solution: def isPowerOfTwo(self, n: int) -> bool: for x in range(31): if n==2**x: return True return False根据提示,这里循环到就可以出结果了。
力扣提交通过,时间复杂度O(1)(循环次数是固定常数 31,与输入 n 无关),空间复杂度O(1)。
豆包给了一个优化后的代码
class Solution: def isPowerOfTwo(self, n: int) -> bool: if n <= 0: # 提前过滤无效值 return False for x in range(31): if n == (1 << x): # 位运算替代 2^x,更高效 return True return False位运算1 << x替代 2^x,我真没想到还能这么计算。
都怪十进制给我打上了思想钢印,我的大脑需要用二进制重新格式化:)
位运算
class Solution: def isPowerOfTwo(self, n: int) -> bool: if n<=0: return False if n&(n-1)==0: return True else: return False力扣提交通过,时间复杂度和空间复杂度都是O(1)。
判断一个数 x 是不是 2 的幂,需要满足:
x & (x - 1) == 0
并且x > 0
举个例子,x=2,二进制为010,减1后为001。
010 & 001 ==0
这里拿3位二进制数举例,实际上python支持的二进制位数是没有限制的。
力扣官方题解
方法一:二进制表示
class Solution: def isPowerOfTwo(self, n: int) -> bool: return n > 0 and (n & (n - 1)) == 0这个跟我的代码差不多,不过官方题解只用了一行代码。
力扣提交通过,时间复杂度和空间复杂度都是O(1)。
class Solution: def isPowerOfTwo(self, n: int) -> bool: return n > 0 and (n & -n) == n举个例子,n=2,二进制为010,-n的计算方法是对二进制n取反(~)在加1。
~n+1==101+1
101+1==110
010 & 110 == 010
这里拿3位二进制数举例,实际上python支持的二进制位数是没有限制的。
如果想要验证一下,可以打开WIN10自带的cmd,输入python回车。
输入0b10&-0b10回车,结果是2。
注意这里输入的是二进制数字,python默认输出的十进制数字。
力扣提交通过,时间复杂度和空间复杂度都是O(1)。
方法二:判断是否为最大 2 的幂的约数
class Solution: BIG = 2**30 def isPowerOfTwo(self, n: int) -> bool: return n > 0 and Solution.BIG % n == 0代码利用了更大的 2 的幂能被所有更小的 2 的幂整除的特性,只需要计算一次除法就可以得出结果。
力扣提交通过,时间复杂度和空间复杂度都是O(1)。
尾声
最后说一下为什么二进制求负数要先取反,再加1。
还是用3位二进制数010举例,取反后为101,+1后为110。
010+110==1000
由于系统设定为3位二进制数,左侧超出部分会舍弃,最后的结果是000,正好符合2+-2=0的十进制计算法则。
二进制位运算虽然看起来有点反人类,却是计算机的硬件基础原理。
它的历史要比现在所有的编程语言都要古老。
理论根源最早可以追溯到1847年布尔代数,工程实现则来自计算机硬件的老祖宗香农21岁时的一篇论文《继电器与开关电路的符号分析》。
小说《三体》中的秦始皇人力计算机就是对二进制逻辑门与位运算的模拟。
刘慈欣作为计算机工程师,理论功底还是很扎实的。
可惜我第一次看的时候,没看懂:(
我是个编程爱好者,小白级别的,如果你跟我一样希望通过力扣刷题,学习各种奇妙的算法,可以关注我,大家一起学习。
夜雨聆风