悄摸儿地我来了,正如我蔫儿巴地走~
日更打卡!
11.二进制中1的个数
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路:第一种,简单粗暴的解法是转换成str,再用str的count找有几个1。分两种情况,分别是n>=0和n<0。
- n>=0,正常计算;
- n<0,由于计算补码,n=n+2^32。
class Solution:
def NumberOf1(self, n):
# write code here
if n >= 0:
s = str(bin(n)).count('1') # s是1的个数
else:
s = str(bin(pow(2,32)+n)).count('1')
return s
另一种解法是比较巧妙的,能够体现编程之美的,剑指offer给出的解答~
假设该数n不为0,那么至少有1个1,不管这个1的位置在哪里,用n-1的话,n最右边的1变为0,最右边1后面所有的0变为1,其余位不变。然后如果把n和n-1做与运算,最右边的1就没有啦!!
废话不多说,上图示!
这样减了两次1之后,就没有1了!全是0!结果1的个数就是2个~
class Solution:
def NumberOf1( self, n):
if n == 0:
return 0
res = 0
if n <= 0:
n += pow(2,32)
while n:
n &= (n-1)
res += 1
return res
12.数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0.
?就这?投机取巧第一名来了:
class Solution:
def Power(self, base, exponent):
return pow(base, exponent)
当然了,面试的时候这么回答,可能坟头草都2米了
那么这个考察的主要是我们能不能把base和exponent的情况区分清楚。
- 当base=0, 0的正数幂都等于0。0的负数幂没有定义;
- 当exponent=0, 0指数幂,除底为0外都为1;
- 当exponent>0,直接运算exponent个base相乘;
- 当exponent<0,直接运算exponent个base相乘,结果取倒数;
class Solution:
def Power(self, base, exponent):
if base == 0:
return 0
if exponent == 0:
return 1
res = 1
for i in range(abs(exponent)):
res *= base
if exponent < 0:
return 1/res
else:
return res
13.调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
[1,2,3,4,5,6] # before
[1,3,5,2,4,6] # after
这个可以考虑用空间换时间,开辟两个数组,一个存放奇数一个存放偶数,到结果返回的时候合并起来。比较投机~
class Solution:
def reOrderArray(self, array):
even, odd = [], []
for i in range(len(array)):
if array[i] % 2 != 0:
odd.append(array[i])
else:
even.append(array[i])
return odd+even
还有一种思路就是可以考虑插入排序,如果是奇数就插入到第一个遇到的偶数前面。(偷懒一下,如果想看这种解法可以留言给我~)
14.链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点。
这题非常经典了!因为不知道遍历链表的尽头在哪里,所以让一个指针b从头开始先走k-1步,然后再让另一个指针a和b一起走,这样指针b走到尽头时,指针a指向的就是倒数第k个节点~
这里记得要考虑,假设有3个节点,却要找倒数第4个,这个情况下就要返回None。
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindKthToTail(self, head, k):
a, b = head, head
for i in range(k): # 向前走k-1步
if b: # 如果下一个节点存在
b = b.next
else: # 如果k大于链表长
return None
while b:
a,b = a.next, b.next
return a
啊~ 更完了今天的内容!那么明天见啦,如果有任何疑问都可以评论区or私信一起讨论!
顺便附上之前的更新:
嘿我头发呢:剑指offer系列python实现 日更(一)zhuanlan.zhihu.com