python 两个数组相乘_剑指offer系列python实现 日更(四)

d55567b95f2c6e7c53322f0dcc1ea7f1.png

悄摸儿地我来了,正如我蔫儿巴地走~

日更打卡!

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

de39ea358fe407033cda1780d609a9e7.png

另一种解法是比较巧妙的,能够体现编程之美的,剑指offer给出的解答~

假设该数n不为0,那么至少有1个1,不管这个1的位置在哪里,用n-1的话,n最右边的1变为0,最右边1后面所有的0变为1,其余位不变。然后如果把n和n-1做运算,最右边的1就没有啦!!

废话不多说,上图示!

9f323455e9b435953f23eb0173cd8782.png

这样减了两次1之后,就没有1了!全是0!结果1的个数就是2个~

8567b978873d9fa8357aefa5c2173e0c.png
全 是 0
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

687f8c41789f99c6b656203925b35dfb.png

12.数值的整数次方

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0.

?就这?投机取巧第一名来了:

class Solution:
    def Power(self, base, exponent):
        return pow(base, exponent)

0dbd4c76ccc49485868255aaaa10bfed.png

当然了,面试的时候这么回答,可能坟头草都2米了

那么这个考察的主要是我们能不能把base和exponent的情况区分清楚。

  1. 当base=0, 0的正数都等于00的负数没有定义;
  2. 当exponent=0, 0指数幂,除底为0外都为1;
  3. 当exponent>0,直接运算exponent个base相乘;
  4. 当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

feaa386a33df38f9ca2bbaeea58013ef.png

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

48d5f919c0bbc2e0a4d98a7ef1ed3a73.png

还有一种思路就是可以考虑插入排序,如果是奇数就插入到第一个遇到的偶数前面。(偷懒一下,如果想看这种解法可以留言给我~)

e75412031bb0d69a00ce1c8f4bd51825.png

14.链表中倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点。

这题非常经典了!因为不知道遍历链表的尽头在哪里,所以让一个指针b从头开始先走k-1步,然后再让另一个指针a和b一起走,这样指针b走到尽头时,指针a指向的就是倒数第k个节点~

9eacd3a7419dc8af4030093f4ce25a5a.png

这里记得要考虑,假设有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

795a6ada28eb4e3fd3244de238fff945.png

啊~ 更完了今天的内容!那么明天见啦,如果有任何疑问都可以评论区or私信一起讨论!

32ea3da973d0ac9f6dfc6e90f7775212.png
rerorerorero

顺便附上之前的更新:

嘿我头发呢:剑指offer系列python实现 日更(一)​zhuanlan.zhihu.com
嘿我头发呢:剑指offer系列python实现 日更(二)​zhuanlan.zhihu.com
f0747ac8ebe0f9b3bb38ae8baa89e41b.png
嘿我头发呢:剑指offer系列python实现 日更(三)​zhuanlan.zhihu.com
f11ea07ea1b441738b6326f87611d363.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值