剑指 Offer

前言

  1. 本文内容是《剑指 Offer》的问题求解整理,使其文档化,主要包括问题的代码编写(主流语言)和思路分析。
  2. 文章结构按照10小题为一章节来划分,每一小题的编程语言的实现一般按照【低级语言》脚本语言》高级语言】的格式来展示。
  3. 引用别人的一句话“我们不生产代码,我们是代码的搬运工”。
  4. 文章内容仅供参考。

1~10

  1. 二维数组的查找

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

      
      
         <?php
      
      function Find($target, $array)
      {
          foreach($array as $key=>$val){
              if(in_array($target,$val)){
                  return "true";
              }
          }
          return "false";
      }
      while(fscanf(STDIN,"%d,%s",$a,$b) == 2){
          $target = $a;
          eval('$array='.$b.';');
          try{
              echo Find($target,$array)."n";
          }catch(Exception $e){
              die;
          }
      }
      
         public class Solution {
          public boolean Find(int target, int [][] array) {
              int rows = array.length;
              int cols = array[0].length;
              int i=rows-1,j=0;
              while(i>=0 && j<cols){
                  if(target<array[i][j])
                      i--;
                  else if(target>array[i][j])
                      j++;
                  else
                      return true;
              }
              return false;
          }
      }
      
      # -*- coding:utf-8 -*-
      class Solution:
       # array 二维列表
       def Find(self, target, array):
           rows=len(array)
           cols=len(array[0])
           i=rows-1
           j=0
           while i>=0 and j<cols:
               if target<array[i][j]:
                   i -= 1
               elif target>array[i][j]:
                   j += 1
               else:
                   return True
           return False
      
         class Solution
      {
          public bool Find(int target, int[][] array)
          {
              int row=0;
              int col=array[0].Length-1;
              while(row<=array.Length-1&&col>=0){
                  if(target==array[row][col])
                      return true;
                  else if(target>array[row][col])
                      row++;
                  else
                      col--;
              }
              return false;
      
          }
      }
      
    • 解题思路
      矩阵是有序的,从左下角来看,向上数字递减,向右数字递增,因此从左下角开始查找,当要查找数字比左下角数字大时。右移要查找数字比左下角数字小时,上移。
  2. 替换空格
    • 题目描述
      请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

         <?php
      // 直接使用函数
      function replaceSpace($str)
      {
          return str_replace(' ','%20',$str);
      }
      // 不允许直接调用内置函数
      <?php
      function replaceSpace($str)
      {
          $res = '';
          $strLength = strlen($str);
          for($i=0;$i<$len;$i++){
              if($str[$i]==' '){
                      $res .='%20';
              }else{
                      $res .=$str[$i];
              }
          }
          return $res;
      }
      
    • 解题思路
      • 问题1:替换字符串,是在原来的字符串上做替换,还是新开辟一个字符串做替换!
      • 问题2:在当前字符串替换,怎么替换才更有效率(不考虑内置的replace方法)。
        • 从前往后替换,后面的字符要不断往后移动,要多次移动,所以效率低下
        • 从后往前,先计算需要多少空间,然后从后往前移动,则每个字符只为移动一次,这样效率更高一点。
  3. 从尾到头打印链表
    • 题目描述
      输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

           <?php
      
      /*class ListNode{
          var $val;
          var $next = NULL;
          function __construct($x){
              $this->val = $x;
          }
      }*/
      function printListFromTailToHead($head)
      {
          $arrayList = [];
          while($head !== null){
              $arrayList[]=$head->val;
              $head=$head->next;
          }
          return array_reverse($arrayList);
      }
      
    • 解题思路
      有三种思路,

      • 第一就是利用栈先入后出的特性完成;
      • 第二就是存下来然后进行数组翻转;
      • 第三是利用递归。
  4. 重建二叉树
    • 题目描述
      输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

      
      
    • 解题思路
  5. 题目描述
    解题思路
  6. 题目描述
    解题思路
  7. 题目描述
    解题思路
  8. 题目描述
    解题思路
  9. 题目描述
    解题思路

11~20

题目描述
解题思路

题目描述
解题思路

题目描述
解题思路

题目描述
解题思路

题目描述
解题思路

21~30

题目描述
解题思路

题目描述
解题思路

题目描述
解题思路

题目描述
解题思路

题目描述
解题思路

题目描述
解题思路

题目描述
解题思路

题目描述
解题思路

题目描述
解题思路

题目描述
解题思路

原文:大专栏  剑指 Offer

原文地址:https://www.cnblogs.com/petewell/p/11601787.html

时间: 2024-10-08 07:23:03

剑指 Offer的相关文章

【剑指offer】Q38:数字在数组中出现的次数

与折半查找是同一个模式,不同的是,在这里不在查找某个确定的值,而是查找确定值所在的上下边界. def getBounder(data, k, start, end, low_bound = False): if end < start : return -1 while start <= end: mid = ( start + end ) >> 1 if data[ mid ] > k: end = mid - 1 elif data[ mid ] < k: star

【剑指offer】树的子结构

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25907685 剑指offer第18题,九度OJ上测试通过! 题目描述: 输入两颗二叉树A,B,判断B是不是A的子结构. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行一个整数n,m(1<=n<=1000,1<=m<=1000):n代表将要输入的二叉树A的节点个数(节点从1开始计数),m代表将要输入的二叉树B的节点个数(节点从1开始计数).

【剑指offer】二叉树的镜像

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25915971 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.C

【剑指offer】数组中仅仅出现一次的数字(1)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27649027 题目描写叙述: 一个整型数组里除了两个数字之外,其它的数字都出现了两次.请敲代码找出这两个仅仅出现一次的数字. 输入: 每一个測试案例包括两行: 第一行包括一个整数n,表示数组大小.2<=n <= 10^6. 第二行包括n个整数,表示数组元素,元素均为int. 输出: 相应每一个測试案例.输出数组中仅仅出现一次的两个数.输出的数字从小到大的顺序. 例子输入: 8 2 4

牛客网上的剑指offer题目

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一个字符串中的空格替换成"%20" 两种方法实现:输入一个链表,从尾到头打印链表每个节点的值 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 剑指offer 斐波那契数列 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个

剑指Offer——如何做好自我介绍

剑指Offer--如何做好自我介绍 前言 自我特点+经历梳理 ??各位老师好,我叫某某某,研究生三年级,就读于某某大学信息科学与工程学院软件工程专业.主要使用的开发语言是Java,熟悉基本数据结构和基本算法实现:熟悉MySQL数据库:掌握Linux基本操作命令:所参与的主要项目有"立马送药","鲜花礼品网","基于Android实现的购彩系统"和"我看看"购物分享Android APP.其中,"立马送药"的

剑指Offer——Trie树(字典树)

剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高. Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的. Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子右兄弟的方法建树的话,可能会好点.可见,优

【剑指Offer面试题】二维数组中的查找

下决心AC所有剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有好处的.加油~ 二维数组中的查找 时间限制:1 秒内存限制:32 兆 特殊判题:否提交:19005解决:3642 题目描述: 在一个

[剑指Offer]12.二进制中1的个数

题目 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路 把一个整数减去1,再和原整数做与运算,会把整数最右边一个1变成0.那么一个整数的二进制表示中有多少个1,就可以进行多次这样的操作. 代码 /*--------------------------------------- * 日期:2015-07-20 * 作者:SJF0115 * 题目: 12.二进制中1的个数 * 结果:AC * 网址:http://www.nowcoder.com/books/coding-int

C++中求数组连续子向量的最大和(牛客剑指offer)

/////////////////////////////////////////////////////////////////// //HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学. //今天测试组开完会后,他又发话了:在古老的一维模式识别中, //常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决. //但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢? //例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开