剑指offer(数据结构篇)
来源:互联网 发布:关系数据库教程 编辑:程序博客网 时间:2024/06/05 19:50
3 数组——二维数组中的查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序
每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
class Solution: # array 二维列表 def Find(self, array, target): # 判断数组是否为空 if array == []: return False rawnum = len(array) colnum = len(array[0]) # 判断非法输入 # 可以换成 isinstance(target, (int, float)) 进行判断 if type(target) == float and type(array[0][0]) == int: target = int(target) elif type(target) == int and type(array[0][0]) == float: target = float(int) elif type(target) != type(array[0][0]): # 浮点数的相等判断问题需要特别注意, 一般都是判断两个数的差值是否小于一个特别小的数。这里不展开分析。 return False i = colnum - 1 j = 0 while i >= 0 and j < rawnum: if array[j][i] < target: j += 1 elif array[j][i] > target: i -= 1 else: return True return False # 扩展, 输出数组中target的个数 def searchMatrix(self, matrix, target): if matrix == None or len(matrix) == 0: return 0 rows = len(matrix) cols = len(matrix[0]) row, col = 0, cols - 1 count = 0 while row <= rows - 1 and col >= 0: if matrix[row][col] > target: col -= 1 elif matrix[row][col] < target: row += 1 else: count += 1 col -= 1 return countarray = [[1, 2, 8, 9], [2, 4, 9, 12], [4, 7, 10, 13], [6, 8, 11, 15]]array2 = []array3 = [['a', 'b', 'c'], ['b', 'c', 'd']]array4 = [[62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80],[63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82],[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83],[66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],[67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85]]findtarget = Solution()print(findtarget.Find(array, 10))print(findtarget.Find(array, 30))print(findtarget.Find(array, 13.0))print(findtarget.Find(array, ''))print(findtarget.Find(array2, 10))print(findtarget.Find(array3, 'b'))print(findtarget.searchMatrix(array4, 81))
4.字符串——替换空格
实现一个函数,将一个字符串中的空格替换成“%20”。
例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
class Solution: # s 源字符串 # 创建新的字符串进行替换 def replaceSpace1(self, s): tempstr = '' if type(s) != str: return for c in s: if c == ' ': tempstr += '%20' else: tempstr += c return tempstr # 简单代码替换 # 在Python中str类型是不可变的类型, 使用replace语句会生成一个新的str, 原始的s还是带空格的str变量 def replaceSpace2(self, s): if type(s) != str: return return s.replace(' ', '%20') # 书中给的思路 # 判断输入类型的时候,isinstance必须首先判断,因为如果输入为integer的话,没有len,就会直接报错 def replaceSpace3(self, s): if not isinstance(s,str) or len(s) <= 0 or s == None: return "" spaceNum = 0 for i in s: if i == " ": spaceNum += 1 newStrLen = len(s) + spaceNum * 2 newStr = newStrLen * [None] indexOfOriginal, indexOfNew = len(s) - 1, newStrLen - 1 while indexOfNew >= 0 and indexOfNew >= indexOfOriginal: if s[indexOfOriginal] == ' ': newStr[indexOfNew-2:indexOfNew+1] = ['%', '2', '0'] indexOfNew -= 3 indexOfOriginal -= 1 else: newStr[indexOfNew] = s[indexOfOriginal] indexOfNew -= 1 indexOfOriginal -= 1 return "".join(newStr)s = 'we are happy'test = Solution()print(test.replaceSpace1(s))print(test.replaceSpace2(s))print(test.replaceSpace3(s))
5.链表——从尾到头打印链表
class Solution: # 返回从尾部到头部的列表值序列,例如[1,2,3] def printListFromTailToHead(self, listNode): newlist =[] while listNode is not None: newlist.append(listNode.val) listNode = listNode.next return newlist[::-1]node1 = ListNode(23456)node2 = ListNode(33)node3 = ListNode(456)node1.next = node2node2.next = node3singleNode = ListNode(23456)test = ListNode()S = Solution()print(S.printListFromTailToHead(node1))print(S.printListFromTailToHead(test))print(S.printListFromTailToHead(singleNode))
6.树——重建二叉树
这个比较难一点,输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = Noneclass Solution: # 返回构造的TreeNode根节点 def reConstructBinaryTree(self, pre, tin): # write code here if not pre and not tin: return None root = TreeNode(pre[0]) if set(pre) != set(tin): return None i = tin.index(pre[0]) root.left = self.reConstructBinaryTree(pre[1:i+1], tin[:i]) root.right = self.reConstructBinaryTree(pre[i+1:], tin[i+1:]) return rootpre = [1, 2, 3, 5, 6, 4]tin = [5, 3, 6, 2, 4, 1]test = Solution()newTree = test.reConstructBinaryTree(pre, tin)
7.栈和队列
用两个栈实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
# -*- coding:utf-8 -*-class Solution: def __init__(self): self.stack1 = [] self.stack2 = [] def push(self, node): self.stack1.append(node) def pop(self): if len(self.stack2) == 0 and len(self.stack1) == 0: return elif len(self.stack2) == 0: while len(self.stack1) > 0: self.stack2.append(self.stack1.pop()) return self.stack2.pop()P = Solution()P.push(10)P.push(11)P.push(12)print(P.pop())P.push(13)print(P.pop())print(P.pop())print(P.pop())print(P.pop())
阅读全文
0 0
- 剑指offer(数据结构篇)
- 剑指offer-数据结构:字符串(基础知识)
- 剑指offer之数据结构
- 剑指offer(二.1)数据结构篇之数组
- 剑指offer--数据结构之栈(2,18,24,39)
- 剑指offer--数据结构之链表(9、19、35)
- 剑指offer-数据结构:数组和指针(基础知识)
- 剑指offer 2.3 数据结构3-字符串
- 数组与指针(剑指offer数据结构部分)
- 《剑指Offer》2.3数据结构 java版
- 剑指offer--数据结构之二叉树(1、4、6、11、12、27、48、50、60)
- 剑指offer——滑动窗口的最大值(好题,数据结构)
- 剑指offer(27)-二元树的深度[数据结构]
- 剑指offer(35)-两链表的第一个公共结点[数据结构]
- 剑指offer 2.3 数据结构1-数组求sizeof()
- 剑指offer 2.3 数据结构2-二维数组中的查找
- 剑指offer 2.3 数据结构4-替换字符串中的空格
- 【数据结构|剑指Offer】单向链表的各项操作实现
- 考试注意事项
- 使用js仿写jquery中$.ajax()方法
- Js实现倒计时功能
- android手机上的返回键和home键
- ++和--操作符分析
- 剑指offer(数据结构篇)
- osg之基本图元(二)
- 2017.11.8心得
- 指针详解
- BZOJ 1935: [Shoi2007]Tree 园丁的烦恼
- 语音识别原理--理论基础(一)
- HTML5 学习札记
- Morning Greeting-----Python
- BZOJ4423: [AMPPZ2013]Bytehattan(并查集,对偶图)