1.1题目:二维数组中的查找:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

1.2思路:首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数组,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围中剔除一行或者一列,这样每一步都可以缩小查找的范围,直到找到要查找的数字,或者查找范围为空。

1.3代码:

  1. # -*- coding:utf-8 -*-
  2. class Solution:
  3. # array 二维列表
  4. def Find(self, target, array):
  5. # write code here
  6. rows = len(array)
  7. cols = len(array[0])
  8.  
  9. if rows > 0 and cols > 0:
  10. row = 0
  11. col = cols - 1
  12. while row < rows and col >= 0:
  13. if target == array[row][col]:
  14. return True
  15. elif target < array[row][col]:
  16. col -= 1
  17. else:
  18. row += 1
  19. return False

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

2.2思路:建立一个新的空字符串tempstr,然后遍历输入的字符串,判断字符串中当前字符是否为空,若否,添加字符到空字符串tempstr中,若是,添加%20到空字符串tempstr中,最后返回tempstr。

2.3 代码:

  1. # -*- coding:utf-8 -*-
  2. class Solution:
  3. # s 源字符串
  4. def replaceSpace(self, s):
  5. # write code here
  6. tempstr = ''
  7. for c in s:
  8. if c == ' ':
  9. tempstr += "%20"
  10. else:
  11. tempstr += c
  12. return tempstr

3.1题目:从尾到头打印链表:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

3.2解题思路:创建一个栈,循环遍历节点并将节点的data存放到栈中,最后返回这个栈。(栈的特性:先进后出)

3.3代码:

  1. # -*- coding:utf-8 -*-
  2. # class ListNode:
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6.  
  7. class Solution:
  8. # 返回从尾部到头部的列表值序列,例如[1,2,3]
  9. def printListFromTailToHead(self, listNode):
  10. # write code here
  11. result = []
  12. while listNode:
  13. result.insert(0, listNode.val)
  14. listNode = listNode.next
  15. return result

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

4.2解题思路:

  通常树有如下几种遍历方式:

  • 前序遍历:先访问根结点,再访问左子结点,最后访问右子结点。
  • 中序遍历:先访问左子结点,再访问根结点,最后访问右子结点。
  • 后序遍历:先访问左子结点,再访问右子结点,最后访问根结点。

  本题为前序遍历和中序遍历,最少需要两种遍历方式,才能重建二叉树。

  前序遍历序列中,第一个数字总是树的根结点的值。在中序遍历序列中,根结点的值在序列的中间,左子树的结点的值位于根结点的值的左边,而右子树的结点的值位于根结点的值的右边。剩下的我们可以递归来实现,具体如图:

4.3代码:

  1. # -*- coding:utf-8 -*-
  2. # class TreeNode:
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.left = None
  6. # self.right = None
  7. class Solution:
  8. # 返回构造的TreeNode根节点
  9. def reConstructBinaryTree(self, pre, tin):
  10. # write code here
  11. if len(pre) == 0:
  12. return None
  13. elif len(pre) == 1:
  14. return TreeNode(pre[0])
  15. else:
  16. root = TreeNode(pre[0])
  17. pos = tin.index(pre[0])
  18. root.left = self.reConstructBinaryTree(pre[1:pos+1], tin[:pos])
  19. root.right = self.reConstructBinaryTree(pre[pos+1:], tin[pos+1:])
  20. return root

牛客网刷题平台:https://www.nowcoder.com/ta/coding-interviews

参考:https://cuijiahua.com/(这位大牛的个人网站非常给力,强烈建议大家过去看看!)

剑指offer--day01的更多相关文章

  1. 剑指Offer面试题:1.实现Singleton模式

    说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...

  2. 剑指Offer面试题:14.链表的倒数第k个节点

    PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善. 一.题目:链表的倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题 ...

  3. 《剑指offer》面试题12:打印1到最大的n位数

    面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...

  4. 《剑指offer》面试题11: 数值的整数次方

    面试题11: 数值的整数次方 剑指offer面试题11,题目如下 实现函数double power(double base,int exponent),求base的exponent次方, 不得使用库 ...

  5. 剑指 Offer 题目汇总索引

    剑指 Offer 总目录:(共50道大题) 1. 赋值运算符函数(或应说复制拷贝函数问题) 2. 实现 Singleton 模式 (C#) 3.二维数组中的查找 4.替换空格              ...

  6. 面试题目——《剑指Offer》

    1.把一个字符串转换成整数——<剑指Offer>P29 2.求链表中的倒数第k个结点——<剑指Offer>P30 3.实现Singleton模式——<剑指Offer> ...

  7. 剑指offer习题集2

    1.把数组排成最小的数 class Solution { public: static bool compare(const string& s1, const string& s2) ...

  8. 剑指offer习题集1

    1.打印二叉树 程序很简单,但是其中犯了一个小错误,死活找不到,写代码要注意啊 这里左右子树,要注意是node->left,结果写成root->left vector<int> ...

  9. 剑指Offer:面试题20——顺时针打印矩阵(java实现)

    题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数 字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, ...

  10. 牛客网上的剑指offer题目

    题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一 ...

随机推荐

  1. 管线命令(Pipe)

    管线命令接受|前面传来的stdout,管线示意图如下所示: 管线两个需要注意的地方: 1.管线仅会处理stdout,忽略对stderr的处理 2.管线必须接受前个指令的stdin才是 那么,如果我想接 ...

  2. Linux学习--第五天--vim使用、rpm命令

    vim使用 三种模式: 编辑模式 插入模式 命令模式 |命令|作用| |--|--| |a|在光标字符后插入| |A|在光标行尾插入| |i|在光标字符前插入| |I|在光标行首插入| |o|在光标下 ...

  3. Python3找出List中最大_最小的N个数及索引

    # -*- coding: utf-8 -*- import heapq nums = [1, 8, 2, 23, 7, -4, 18, 23, 24, 37, 2] # 最大的3个数的索引 max_ ...

  4. UVa11806 Cheerleaders(容斥原理)

    11806 - Cheerleaders Time limit: 2.000 seconds C Cheerleaders In most professional sporting events, ...

  5. c语言之ascii字符

    int main(){ char buf[20] = {104,101,108,108,111,0}; printf("buf:%s\n",buf); return 0;} 打印结 ...

  6. adam优化

    AdaGrad (Adaptive Gradient,自适应梯度) 对每个不同的参数调整不同的学习率, 对频繁变化的参数以更小的步长进行更新,而稀疏的参数以更大的步长进行更新. gt表示第t时间步的梯 ...

  7. SpringBoot配置自定义美化Swagger2

    1.添加maven依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springf ...

  8. 【NOIP2013模拟】导弹防御塔

    题目 Freda的城堡-- "Freda,城堡外发现了一些入侵者!" "喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛lala~" "可是入侵者 ...

  9. linux运维、架构之路-KVM虚拟化技术

    一.云计算概述 云计算:是一种资源使用和交付模式 虚拟化:一种具体的技术,用来将物理机虚拟成为多个相互独立的虚拟机.云计算不等于虚拟化,云计算是使用了虚拟化的技术做支撑 二.KVM配置使用 1.系统环 ...

  10. [算法]Min_25筛

    前言 本篇文章中使用的字母\(p\),指\(\text{任意的} p \in \text{素数集合}\) 应用场景 若函数\(f(x)\)满足, \(f(x)\)是积性函数 \(f(p)\)可以使用多 ...