剑指offer(第2版)python实现

剑指offer第二版

  • 第2章 面试需要的基本知识
    • 2.2 编程语言
      • 面试题2:实现单例设计模式
    • 2.3 数据结构
      • 面试题3:数组中重复的数字
      • 面试题4:二维数组中的查找
      • 面试题5:替换空格
      • 面试题6:从尾到头打印链表
      • 面试题7:重建二叉树

第2章 面试需要的基本知识

2.2 编程语言


面试题2:实现单例设计模式

题目: 设计一个类,我们只能生成该类的一个实例

LeetCode: 此题LeetCode上没有

题解思路:

定义一个私有标志,并初始化为None,如果创建了一个实例则将此标志设置为该实例。

实现代码:

class Earth(object):
    __instance = None

    def __new__(cls):
        if cls.__instance is not None:
            # 如果__instance为空则表示为第一次创建实例
            # 通过父类的__new__(cls)创建实例
            cls.__instance = object.__new__(cls)
            return cls.__instance
        else:
            # 返回上一个对象的引用
            return cls.__instance


2.3 数据结构

面试题3:数组中重复的数字

题目: 给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度),
其中有些元素出现两次而其他元素出现一次。找到所有出现两次的元素。

题目要求:你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?

LeetCode: LeetCode 442:数组中重复的数据

题解思路:

  1. 首先由于该数组中间所有的数字都不会超过该数组的长度,所以我们可以用该数组下标的值来存储对应位置的值是否存在。
  2. 如果该位置的值大于零,则将该数组对应数组此数字映射下标的值设为负数,如果再次访问该负数时则将重复元素返回。

实现代码:

def findDuplicates(nums):
    m_list = []
    for i in nums:
        # 首先将数组依次遍历,判断该数字对应数组下标的位置是否为整数
        # 如果是正数,则表明该数字为第一次出现,如果为负数,则表示该数字已经重复出现过了
        if nums[abs(i)-1] > 0:
            nums[abs(i)-1] *= -1
        else:
            m_list.append(abs(i))

    print(m_list)


if __name__ == '__main__':
    list = [4, 3, 2, 7, 8, 2, 3, 1]
    findDuplicates(list)


面试题4:二维数组中的查找

题目: 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。
该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。

题目要求:

LeetCode: LeetCode 240:搜索二维矩阵 II

题解思路:

  1. 优于矩阵是有序的所以我们可以从首行最大的元素开始判断。
  2. 如果该值小于目标值,则该行不存在大于目标值的数,转而去判断下一行。
  3. 如果该值大于目标值,则将列进行舍弃,因为该列不存在大于目标值的数,因此判断剩余矩阵中否有该目标值。

实现代码:

def searchMatrix(matrix, target):
    found = False
    # 对应的行数
    rows = len(matrix)
    # 对应数组的列数
    columns = len(matrix[0])
    if matrix is not None and rows > 0 and columns > 0:
        # 设定一个行的下标
        row = 0
        # 设定一个列的下标
        column = columns - 1
        # 因为行数一开始为零,所以设定循环行数不大于最大行数
        # 列数循环最后不小于0
        while row < rows and column >= 0:
            if matrix[row][column] == target:
                found = True
                return found
            elif matrix[row][column] > target:
                column -= 1
            else:
                row += 1
        return found


if __name__ == '__main__':
    mli = [
        [1,   4,  7, 11, 15],
        [2,   5,  8, 12, 19],
        [3,   6,  9, 16, 22],
        [10, 13, 14, 17, 24],
        [18, 21, 23, 26, 30]
    ]
    found = searchMatrix(mli, 20)
    print(found)


面试题5:替换空格

题目:
请实现一个函数,将一个字符串中的每个空格替换成“%20”。
例如:当字符串为: We Are Happy
替换之后的字符串为: We%20Are%20Happy

题目要求:

LeetCode: 牛客网

题解思路:

直接用python内置的字符串替换函数replace将空格替换为%20

实现代码:

def replaceSpace(s):
    return s.replace(' ', '%20')


if __name__ == '__main__':
    s = 'We are happy'
    print(replaceSpace(s))


面试题6:从尾到头打印链表

题目:
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

题目要求:

LeetCode: LeetCode206: 反转链表

题解思路:

将每个节点指向该节点的前一位,从而完成逆序。

实现代码:

class Solution(object):
	def reverseList(self, head):
		"""
		:type head: ListNode
		:rtype: ListNode
		"""
		# 申请两个节点,pre和 cur,pre指向None
		pre = None
		cur = head
		# 遍历链表,while循环里面的内容其实可以写成一行
		# 这里只做演示,就不搞那么骚气的写法了
		while cur:
			# 记录当前节点的下一个节点
			tmp = cur.next
			# 然后将当前节点指向pre
			cur.next = pre
			# pre和cur节点都前进一位
			pre = cur
			cur = tmp
		return pre	

作者:user7439t
链接:https://leetcode-cn.com/problems/reverse-linked-list/solution/dong-hua-yan-shi-206-fan-zhuan-lian-biao-by-user74/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


面试题7:重建二叉树

题目:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如:
输入前序遍历序列: {1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},
则重建二叉树并返回。

题目要求:

LeetCode: LeetCode206: 反转链表

题解思路:

将每个节点指向该节点的前一位,从而完成逆序。

实现代码:

class Solution(object):
	def reverseList(self, head):
		"""
		:type head: ListNode
		:rtype: ListNode
		"""
		# 申请两个节点,pre和 cur,pre指向None
		pre = None
		cur = head
		# 遍历链表,while循环里面的内容其实可以写成一行
		# 这里只做演示,就不搞那么骚气的写法了
		while cur:
			# 记录当前节点的下一个节点
			tmp = cur.next
			# 然后将当前节点指向pre
			cur.next = pre
			# pre和cur节点都前进一位
			pre = cur
			cur = tmp
		return pre	

作者:user7439t
链接:https://leetcode-cn.com/problems/reverse-linked-list/solution/dong-hua-yan-shi-206-fan-zhuan-lian-biao-by-user74/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


你可能感兴趣的:(算法知识)