剑桥offer系列(1~10)

1.题目描述

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

思路:从左下开始,小,往上,大,往右。

class Solution {
public:
    bool Find(vector<vector<int> > array,int target) {

        if(array.size()==0)return false;
        int r=array.size();
        int c=array[0].size();
        int i=r-1,j=0;

        while(i<r&&i>-1&&j<c&&j>-1){

            if(array[i][j] == target)return true;
            if(array[i][j]>target){
                i--;
            }else{
                j++;
            }
        }
        return false;

    }
};

2.题目描述

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

思路:替换空格。

//length为牛客系统规定字符串输出的最大长度,固定为一个常数
class Solution {
public:
    void replaceSpace(char *str,int length) {
    int i = 0;
    int j = 0;
    int nSpace = 0;
    char *pStr = NULL;
    pStr = (char*)malloc(sizeof(char)*length * 3);
    for (i = 0, j = 0; i<length; i++, j++)
    {
        if (‘ ‘ == str[i])
        {
            pStr[j] = ‘\%‘;
            pStr[++j] = ‘2‘;
            pStr[++j] = ‘0‘;
        }
        else
        {
            pStr[j] = str[i];
        }

    }
    for( i=0;i<j;i++ )
    {
      str[i] = pStr[i];
    }

    free(pStr);
    pStr = NULL;
}
};

3.题目描述

输入一个链表,从尾到头打印链表每个节点的值。

思路:使用vector去接,然后调用逆序算法reverse(v.begin(),v.end());

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(struct ListNode* head) {

        struct ListNode* tmp = head;
        vector<int>v;
        while(tmp != NULL){
            v.push_back(tmp->val);
            tmp = tmp->next;
        }
        reverse(v.begin(),v.end());
        return v;
    }
};

4.题目描述

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

思路:通过前序和中序,找到根,然后递归调用。

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) {
        int in_size = in.size();

        if (in_size == 0)
            return NULL;
        vector<int> pre_left, pre_right, in_left, in_right;
        int val = pre[0];
        TreeNode* node = new TreeNode(val);//root node is the first element in pre
        int p = 0;
        for (; p < in_size; ++p){
            if (in[p] == val) //Find the root position in in
                break;
        }
        for (int i = 0; i < in_size; ++i){
            if (i < p){
                in_left.push_back(in[i]);//Construct the left pre and in
                pre_left.push_back(pre[i + 1]);
            }
            else if (i > p){
                in_right.push_back(in[i]);//Construct the right pre and in
                pre_right.push_back(pre[i]);
            }
        }
        node->left = reConstructBinaryTree(pre_left, in_left);
        node->right = reConstructBinaryTree(pre_right, in_right);
        return node;
    }
};

5.题目描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

思路:数据经过入和出,经过2个栈可以实现队列。

class Solution
{
public:
    void push(int node) {
        stack1.push(node);
    }

    int pop() {

        if(stack2.empty()){
            while(!stack1.empty()){
                stack2.push(stack1.top());
                stack1.pop();
            }
        }
        int node = stack2.top();
        stack2.pop();
        return node;
    }

private:
    stack<int> stack1;
    stack<int> stack2;
};

6.题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

思路:找到突变点,下一个就是所要的值。

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        int i=0;
        int  len = rotateArray.size();
        if(len==0)return 0;
          if(len==1)return rotateArray[0];
        while(i<len-1){
            if(rotateArray[i]<=rotateArray[i+1]){
                i++;
            }else{
                break;
            }
        }
       return   rotateArray[i+1];
    }
};

7.题目描述

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)

class Solution {
public:
    int Fibonacci(int n) {
        if(n == 0)
            return 0;
        if(n == 1)
            return 1;
        int numfn1 = 0, numfn2 = 1;
        int currentnum;
        for(int i=2; i<=n; ++i) {
            currentnum = numfn1+numfn2;
            numfn1 = numfn2;
            numfn2 = currentnum;
        }
        return currentnum;
    }
};

8.题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思路:同第7题

class Solution {
public:
    int jumpFloor(int number) {
        if (number == 1)return 1;
        if (number == 2)return 2;
        int val;
        int num1=1;
        int num2=2;

        while(number-->2){
            val = num1+num2;
            num1 = num2;
            num2 = val;
        }
        return val;
    }
};

9.题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思路:

  a[n]=a[n-1]+a[n-2]+......+a[1];..........................①

  a[n-1]=        a[n-2]+......+a[1];..........................②

  两式相减可知:a[n]=2*a[n-1];

class Solution {
public:
    int jumpFloorII(int number) {
        int f=1,fn=1;
        for(int i=2;i<=number;i++){
            fn=2*f;
            f=fn;
        }
        return fn;
    }
};

10.题目描述

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

思路:同7

class Solution {
public:
    int rectCover(int number) {
        if(number==1)return 1;
        if(number==2)return 2;
        int n1=1,n2=2,val=0;
        for(int i=2;i<number;i++){
            val = n1 + n2;
            n1=n2;
            n2=val;
        }
        return val;
    }
};

时间: 2024-08-07 21:20:24

剑桥offer系列(1~10)的相关文章

剑指Offer系列之题11~题15

目录 11.矩形覆盖 12.二进制中1的个数 13. 数值的整数次方 14.调整数组顺序使奇数位于偶数前面 15.链表中倒数第k个结点 11.矩形覆盖 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 斐波那契数列的应用 第一次竖着放一块类比为走一步,第一次横着放两块类比为走两步 代码与上面的斐波那契数列类题目类似,此处不再赘述:剑指Offer系列之题6~题10. 12.

SpringMVC学习系列(10) 之 异常处理

在项目中如何处理出现的异常,在每个可能出现异常的地方都写代码捕捉异常?这显然是不合理的,当项目越来越大是也是不可维护的.那么如何保证我们处理异常的代码精简且便于维护呢?这就是本篇要讲的内容->异常处理. 在Spring MVC中我们可以通过以下2中途径来对异常进行集中处理: 一.继承HandlerExceptionResolver接口实现自己的处理方法,如: public class MyHandlerExceptionResolver implements HandlerExceptionRe

Android自定义组件系列【10】——随ViewPager滑动的导航条

昨天在用到ViewPager实现滑动导航的时候发现微信的导航条效果是跟随ViewPager的滑动而动的,刚开始想了一下,感觉可以使用动画实现,但是这个滑动是随手指时时变化的,貌似不可行,后来再网上搜了一下,找到一个开源代码,结果打开一看大吃一惊,这么简单的效果代码居然大概有300多行,太占手机存储空间了!后来自己干脆重写ViewGroup使用scrollTo方法实现了一下,具体实现过程如下: package com.example.slideupdownviewpage; import andr

ABP(现代ASP.NET样板开发框架)系列之10、ABP领域层——实体

点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之10.ABP领域层——实体 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate 本文由深圳-Carl提供翻译 实体是DDD(领域驱动设计)的核心概念之一.Eric Eva

MDT2012部署系列之10 WDS安装与配置

(十二).WDS服务器安装 通过前面的测试我们会发现,每次安装的时候需要加域光盘映像,这是一个比较麻烦的事情,试想一个上万个的公司,你天天带着一个光盘与光驱去给别人装系统,这将是一个多么痛苦的事情啊,有什么方法可以解决这个问题了?答案是肯定的,下面我们就来简单说一下. WDS服务器,它是Windows自带的一个免费的基于系统本身角色的一个功能,它主要提供一种简单.安全的通过网络快速.远程将Windows操作系统部署到计算机上的方法.简单一点说就是通过PXE进行启动,然后进行系统的安装.下面我们来

解读ASP.NET 5 &amp; MVC6系列(10):Controller与Action

原文:解读ASP.NET 5 & MVC6系列(10):Controller与Action 我们知道在MVC5和之前的版本,两个框架的生命周期是不一样的,在新版MVC6中,MVC Controller/Web API Controller已经合二为一了,本章我们主要讲解Controller和Action的定义与使用,以及在MVC框架中,如何根据路由查询相应的Controller和Action. Controller&Action的定义和使用 在新版MVC6框架中,依然提供了一个Contro

mysq&#39;l系列之10.mysql优化&amp;权限控制

网站打开慢如何排查 1.打开网页, 用谷歌浏览器F12, 查看network: 哪个加载时间长就优化哪个 2.如果是数据库问题 2.1 查看大体情况 # top # uptime  //load average 负载 mysql> show full processlist; 2.2 查看慢查询日志: long_query_time = 1 log-slow-queries = /data/3306/slow.log 日志分析工具: mysqldumpslow  mysqlsla  myprof

剑指offer系列10:合并两个排序的链表

我拿到这个题的时候举的例子是链表1:1.3.5.7和链表2:2.4.6.8.我的思路是以:1为基础,将表2的每个结点插入表1.也就是说我一次性是要给新建立的链表中加入两个元素,分别是两个原始链表的头结点.这个思路我做了半天头脑一片混乱,中间指针实在不知道怎么弄了.于是我去睡了一觉,哈哈,我大概是这个世界上最会逃避的人了…… 看了答案使用了递归的方法,其实我做的时候我有想到要用递归,但是没用的原因是我一般写代码不喜欢用递归,原因有两个,一个是递归容易死循环,一个是递归的复杂度太高.但这道题真的太适

剑指Offer系列之题6~题10

目录 6.用两个栈实现队列 7.旋转数组的最小数字 8.斐波那契数列 9. 跳台阶 10.变态跳台阶 ?? 6.用两个栈实现队列 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 考虑栈1用于存储元素,出队时,将栈1的元素压入栈2,此时栈2中元素从栈顶到底即其入队的顺序,然后出栈.若出队时栈2非空,则直接从栈2弹出元素. 1.根据栈2是否空将栈1元素全部压入: import java.util.Stack; public class Solution { St