11. 二进制中1的个数
位与
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路很巧妙,可参考牛客二进制中1的个数讨论
class Solution:
def NumberOf1(self, n):
# write code here
count=0
if n < 0:
n = n & 0xffffffff
while n!=0:
n=n&(n-1)
count+=1
return count
注意,使用java或者c++写时不需if判断,因为他两默认转的就是补码形式
而python不是,需要与0xffffffff位与才能变成补码形式
二进制计算
显然,一个很简单的思路是一个一个数
class Solution:
def NumberOf1(self, n):
# write code here
if n<0:
n=n&0xffffffff
return bin(n).count("1")
12.数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
调参划水
# -*- coding:utf-8 -*-
class Solution:
def Power(self, base, exponent):
# write code here
return pow(base,exponent)
累积相乘
显然,我们可以一个一个相乘,但是这个题的关键在于,每个数都是一样的,也就是说,1号和2号的乘积等于3号和4号的乘积
换言之,乘积可以复用,大大减少计算量
# -*- coding:utf-8 -*-
class Solution:
def Power(self, base, exponent):
# write code here
res=base
flag=1
if exponent<0:
exponent*=-1
flag=-1
elif exponent==0:
return 1
while True:
if exponent==1:
res*=base
break
res*=res
exponent=exponent//2
return res if flag==1 else 1/res
13.调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
一种简单的方法是两个for循环,再来一个list保存,或者碰到前后奇偶数就交换,就不写了
分别取出再拼接
注意.python中append(n)是添加n进入list,而extend(n)是添加n内部的对象进入list
# -*- coding:utf-8 -*-
class Solution:
def reOrderArray(self, array):
# write code here
ji,ou=[],[]
for i in range(len(array)):
if array[i]%2==1:
ji.append(array[i])
else:
ou.append(array[i])
ji.extend(ou)
return ji
14.链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个结点。
快慢指针
快指针先往前走k步,注意判断边界,然后快慢一起走,当快指针为none的时候,慢指针走到了倒数第k个节点
class Solution:
def FindKthToTail(self, head, k):
# write code here
slow,fast=head,head
for i in range(k):
if not fast:
return None
fast=fast.next
while fast:
slow=slow.next
fast=fast.next
return slow
15.反转链表
输入一个链表,反转链表后,输出新链表的表头。
直接反转
class Solution:
# 返回ListNode
def ReverseList(self, pHead):
# write code here
pre=None # 代表刚刚走过的节点
while pHead: #为空跳出,刚刚走过的节点pre就是末节点
next=pHead.next #取出next
pHead.next=pre #将当前节点的next换为上个节点pre
pre=pHead #换完之后当前节点走过,pre更新
pHead=next #当前节点更新
return pre