牛客刷题day4
1.链表中倒数第K个节点
题目
输入一个链表,输出该链表中倒数第k个结点。
如果该链表长度小于k,请返回空。
输入:{1,2,3,4,5},1 输出 :{5}
解题思路
1.定义两个指针,fast,slow指向链表的头结点。
2。fast指针先走k步,如果这k步之内fast指针等于空,说明链表长度小于k,直接返回空。
3.然后fast指针和slow指针一起走。当fast指针指向空的时候,slow指针指向的就是倒数第k个节点。
核心代码
class Solution:
def FindKthToTail(self , pHead , k ):
fast = pHead
slow = pHead
for i in range(k):
if not fast:
return fast
fast = fast.next
while fast:
slow = slow.next
fast = fast.next
return slow
2.螺旋矩阵
题目
给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。
解题思路
由于行列不相等,因此定义四个变量用于记录边界:
左边界left
右边界right
上边界top
下边界bottom
然后以top和left基准层层打印,值得注意的是,为了避免重复打印,我们需要在打印下边和左边时额外判断一下
核心代码
class Solution:
def spiralOrder(self, matrix):
# write code here
if not matrix:
return matrix
top = 0
bottom = len(matrix) - 1
left = 0
right = len(matrix[0]) - 1
res = []
while True:
## 矩形上边
for i in range(left, right + 1):
res.append(matrix[top][i])
top += 1
if left > right or top > bottom:
break
## 矩形右边
for j in range(top, bottom + 1):
res.append(matrix[j][right])
right -= 1
if left > right or top > bottom:
break
# 矩形下边
for k in range(right, left - 1, -1):
res.append(matrix[bottom][k])
bottom -= 1
if left > right or top > bottom:
break
# 矩形左边
for l in range(bottom, top-1, -1):
res.append(matrix[l][left])
left += 1
if left > right or top > bottom:
break
return res
牛客上右更加简单的解法,那个充分运用了python的函数,我这种菜gou 只能膜拜,大神的代码我只能考一步步执行才能明白其中含义,上面是便于理解的,当然也贴上更简便的的代码
class Solution:
def spiralOrder(self , matrix ):
# write code here
res = []
while matrix:
res += matrix[0]
matrix = list(zip(*matrix[1:]))[::-1]
return res
3.判断回文
题目
给定一个字符串,请编写一个函数判断该字符串是否回文。如果回文请返回true,否则返回false。
解题思路
题中说了只有小写字母,最简单的就是使用双指针,一个指向前,一个指向后,两个指针同时往中间走,如果两个指针指向的字符不一样就返回false,来看下代码
核心代码
class Solution:
def judge(self, str):
if not str:
return False
start = 0
end = len(str) - 1
while start <= end:
if str[start] != str[end]:
return False
break
start += 1
end -= 1
return True
4.求二叉树的层次遍历
题目
给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
例如:
给定的二叉树是{3,9,20,#,#,15,7},
该二叉树层序遍历的结果是
[[3],[9,20],[15,7]]
解题思路
首先我们定义一个队列,然后将根节点入队,当队列不为空的时候,需要进行以下两个操作:
(1)求出当前队列的长度大小len 。
(2)取出队列前len个节点,每取出一个节点,就把对应节点的左右孩子入队(前提孩子不为空),然后重复这一过程直到队列为空后输出结果。
详细操作流程看下图
核心代码
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#
#
# @param root TreeNode类
# @return int整型二维数组
#
class Solution:
def levelOrder(self , root ):
# write code here
res =[]
if not root:
return res
queue =[root]
while queue:
level_list =[]
for i in range(len(queue)):
tmp = queue.pop(0)
level_list.append(tmp.val)
if tmp.left:
queue.append(tmp.left)
if tmp.right:
queue.append(tmp.right)
res.append(level_list)
return res