继续《剑指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#返回新链表的头指针
继续加油~