在线做题链接 牛客网
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
# 使用位移和与运算,例如 1001&1 = 1 ,右移一位 100&1=0,以此类推
class Solution:
def NumberOf1(self, n):
# write code here
num,i=0,0
while i<32:
if (n>>i)&1:
num+=1
i+=1
return num
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
# 题目意思很明显是求base的exponent次方,而python中的平方可以用
# base**exponent表示,** 底层的源码是快速幂,但是题目原意是手撸快速幂
# 要考虑幂为负数的情况
class Solution:
def Power(self, base, exponent):
if not base:
return 0
if not exponent:
return 1
s = base
summ = 1
x = abs(exponent)
while x:
if x % 2 == 1:
summ = summ * s
x=x//2
s = s*s
return summ if exponent>0 else 1/(summ)
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
# 定义两个列表,然后遍历原列表,奇数偶数分开加入两个列表,然后两个列表进行拼接
class Solution:
def reOrderArray(self, array):
a,b=[],[]
for i in array:
if i&1:
a.append(i)
else:
b.append(i)
return a+b
输入一个链表,输出该链表中倒数第k个结点。
方法: 大家都知道链表不易查询,这道题用快慢指针
一个指针先走k个点,然后两个指针一块走,当第一个走到末尾,
第二个就是倒数第k个节点,需要注意的是判断链表是否有k个节点
# 快慢指针还可以用来求 环,中位数
class Solution:
def FindKthToTail(self, head, k):
fast,slow = head,head
for i in range(k):
if fast:
fast = fast.next
else:
return None # 链表没有k个
while fast:
fast=fast.next
slow=slow.next
return slow
输入一个链表,反转链表后,输出新链表的表头。
class Solution:
# 返回ListNode
def ReverseList(self, pHead):
if pHead:
end = ListNode(pHead.val)
while pHead.next != None:
pHead = pHead.next
start = ListNode(pHead.val)
start.next = end
end = start
return end
return pHead
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
# 随便定义一个头结点,值不重要,然后遍历两个链表即可
class Solution:
# 返回合并后列表
def Merge(self, pHead1, pHead2):
# write code here
l = ListNode(90)
start = l
while pHead1 and pHead2:
if pHead1.val>pHead2.val:
l.next = ListNode(pHead2.val)
x = pHead1
pHead2 = pHead2.next
else:
l.next = ListNode(pHead1.val)
x = pHead2
pHead1 = pHead1.next
l = l.next
if pHead1:
l.next = pHead1
if pHead2:
l.next = pHead2
return start.next
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
# 求出两棵树的前序遍历,用字符串拼接,中间不留空,判断b是否属于a即可
class Solution:
def HasSubtree(self, pRoot1, pRoot2):
# write code here
if pRoot2 and pRoot1:
def dfs(x):
if x:
return str(x.val)+dfs(x.left)+dfs(x.right)
return ''
s1 = dfs(pRoot1)
s2 = dfs(pRoot2)
return s2 in s1
return False
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
递归
class Solution:
# 返回镜像树的根节点
def Mirror(self, root):
# write code here
if root != None:
root.left,root.right = root.right,root.left
self.Mirror(root.left)
self.Mirror(root.right)
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
# 简单模拟,思路要清晰,上下左右找,全部找到后break
class Solution:
# matrix类型为二维列表,需要返回列表
def printMatrix(self, matrix):
# write code here
l = []
h = len(matrix)
if not h:
return l
w = len(matrix[0])
summ = w*h
h0,w0=0,0
while len(l)<summ:
for i in range(w0,w): # 第一行
l.append(matrix[h0][i])
if len(l)>=summ:
break
for i in range(h0+1,h): # 右边列
l.append(matrix[i][w-1])
if len(l)>=summ:
break
for i in range(w-2,w0-1,-1): # 最后一行
l.append(matrix[h-1][i])
if len(l)>=summ:
break
for i in range(h-2,h0,-1): # 左表行
l.append(matrix[i][w0])
h0+=1
w0+=1
h-=1
w-=1
return l
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))
思路 :列表中每次添加时存放一个元组,元组的第一个值是当前值,第二个值为当前的最小值,然后每次添加时取当前最小值与当前添加值作比较
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.s = []
def push(self, node):
minx = self.min()
if node<minx or not minx:
minx = node
self.s.append((node,minx))
# write code here
def pop(self):
if not len(self.s):
return None
return self.s.pop()
# write code here
def top(self):
if not len(self.s):
return None
return self.s[-1][0]
# write code here
def min(self):
if not len(self.s):
return None
return self.s[-1][1]
# write code here