《剑指offer》python实现

继续《剑指offer》刷题之旅,前几天面试一些公司的实习岗,说的话都是知识储备还不够,唉,半路出家我也木有办法啊,得想想做做小项目了,然后刷题慢慢刷吧

python的相关语法还需要练习



二进制中1的个数

题目描述:
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

反码:原码所有位的数字取反
补码:反码加1,对于一个32位的机器,负数的补码表示也可以用原数加上232的二进制数计算

class Solution:
    def NumberOf1(self, n):
        if(n==0):
            return 0
        if(n<0):
            n+=2**32#对于小于0的数 计算其补数
        s=bin(n)
        s=s.strip("0b")
        return s.count("1")

# 还看到一种算法,可以计算n的二进制数中1的个数
# count=0
# while(n):
#     count+=1
#     n=n&(n-1)

数值的整数次方

题目描述:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

本题比较简单,不多赘述

class Solution:
    def Power(self, base, exponent):
        mul=1
        if (exponent>=0):
            for i in range(exponent):
                mul*=base
        else:
            for i in range(-1*exponent):
                mul*=base
            mul=1/mul
        return mul

调整数组顺序使奇数位于偶数前面

题目描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

class Solution:
    def reOrderArray(self, array):
        ls=[]
        for i in range(len(array)):
            if(array[i]%2==1):
                ls.append(array[i])
        for i in range(len(array)):
            if(array[i]%2==0):
                ls.append(array[i])
        return l

本题比较简单,不多赘述


链表中倒数第k个结点

题目描述:
输入一个链表,输出该链表中倒数第k个结点。

本题比较简单,先计算链表总共有多少个节点,根据节点个数与k计算需要输出的节点

class Solution:
    def FindKthToTail(self, head, k):
        # write code here
        cont=0
        p=head
        while(p):
            cont+=1
            p=p.next
        if(k>cont):
            return None
        p=head
        for i in range(cont-k):
            p=p.next
        return p

反转链表

题目描述:
输入一个链表,反转链表后,输出新链表的表头。

本题是一个经典的数据结构题目,需要定义三个链表的指针来对链表进行反转

class Solution:
    # 返回ListNode
    def ReverseList(self, pHead):
        if not pHead or not pHead.next:
            return pHead
        newhead=None
        #需要注意三个指针的替换顺序 不要访问到未知的区域了
        while(pHead):
            tep=pHead.next
            pHead.next=newhead
            newhead=pHead
            pHead=tep
        return newhead

合并两个排序的链表

题目描述:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

本题对两个链表进行循环处理即可,主要当一个链表结束的时候,需要吧另一个链表的后面链接上去

class Solution:
    # 返回合并后列表
    def Merge(self, pHead1, pHead2):
        # write code here
        if not pHead1 and pHead2:
            return pHead2
        elif not pHead2 and pHead1:
            return pHead1
        elif not pHead1 and not pHead2:
            return None
        else:
            newhead=None
            if(pHead1.val<pHead2.val):
                newhead=pHead1
                pHead1=pHead1.next
            else:
                newhead=pHead2
                pHead2=pHead2.next
            start=newhead
            #标记了头结点的位置
            while(pHead1 and pHead2):#当原始两个链表均不为空的时候,循环执行,一旦有一个链表为空则退出
                if(pHead1.val<pHead2.val):
                    newhead.next=pHead1
                    pHead1=pHead1.next
                else:
                    newhead.next=pHead2
                    pHead2=pHead2.next
                newhead=newhead.next
            #将最后没有附加的节点放在新链表的最后
            if not pHead1:
                newhead.next=pHead2
            else:
                newhead.next=pHead1
            return start#返回新链表的头指针

继续加油~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值