代码的鲁棒性(robust)
提高代码的鲁棒性的有效途径是进行防御性编程。其实也是一种编程习惯,是指预见在什么地方可能会出现问题,并为这些可能出现的问题制定处理方式。比如试图打开文件时发现文件不存在,我们可以提示用户检查文件名和路径;
在面试时,最简单的防御性编程就是在函数入口添加代码已验证用户输入是否符合要求。我们需要格外关注这些函数的输入参数。如果输入的是一个指针,那指针是空指针怎么办?如果输入的是一个字符串,那么字符串的内容为空怎么办?
我们看到问题的时候,要多问几个“如果不……那么……”这样的问题。比如面试题 15 “链表中倒数第 k 个结点”,这里蕴含着一个条件就是链表中结点的个数大于 k。我们就要问如果链表中的结点的数目不是大于 k 个,那么代码会出现什么问题?
单向链表的结点只有从前往后的指针而没有从后往前的指针,因此这种思路行不通。
题目描述
输入一个链表,输出该链表中倒数第k个结点。
解题思路
定义两个指针,第一个指针从链表的头指针开始遍历向前走k-1,第二个指针保持不变;从第K步开始,第二个指针也是从链表的头指针开始遍历。由于两个指针的距离保持在k-1,当第一个指针到达链表的伪结点时,第二个指针正好是倒数第k个结点。
python 代码实现:鲁棒性差
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindKthToTail(self, head, k):
# write code here
pAhead = head
pBehind = None
for i in xrange(0, k-1):
pAhead = pAhead.next
return None
pBehind = head
while pAhead.next != None:
pAhead = pAhead.next
pBehind = pBehind.next
return pBehind
鲁棒性高
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindKthToTail(self, head, k):
# write code here
if not head or k == 0:
return None
pAhead = head
pBehind = None
for i in xrange(0, k-1):
if pAhead.next != None:
pAhead = pAhead.next
else:
return None
pBehind = head
while pAhead.next != None:
pAhead = pAhead.next
pBehind = pBehind.next
return pBehind
更快
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindKthToTail(self, head, k):
# write code here
l=[]
while head != None:
l.append(head)
head = head.next
if k > len(l) or k < 1:
return
return l[-k]