小奥的学习笔记

  • Home
  • Learning & Working
    • Speech Enhancement Notes
    • Programming language
    • Computer & DL
    • MOOC
  • Life
    • Life Time
    • Thinking & Comprehension
    • Volunteer
    • Plan
    • Travel
  • Footprints
  • GuestBook
  • About
    • About Me
    • 个人履历
    • 隐私策略
  1. 首页
  2. Study-notes
  3. Programming language
  4. Algorithm
  5. 剑指offer
  6. 正文

《剑指Offer》题目解析(4)

2019年3月4日 1249点热度 0人点赞 0条评论

题目1 斐波那契数列

题目描述

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

代码

递归方法:

int Fibonacci(int n) {
    if(n==0)
        return 0;
    if(n==1||n==2)
        return 1;
    return Fibonacci(n-1)+Fibonacci(n-2);

}

非递归方法:

int Fibonacci(int n) {
        int first = 0;
        int second = 1;

        int result = n;
        for(int i = 2; i<=n; i++){
            result = first + second;
            first = second;
            second = result;
        }
        return result;
    }

题目2 青蛙跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

题目解析

对于这种问题我们可以这样分析。在第一次跳台阶的时候,它可以选择跳1个台阶,也可以选择跳两个台阶。对于它要跳n个台阶来说(设为f(n)),假如第一次跳了1个台阶,那么第二次跳就是f(n-1)的问题;假如第一次跳了2个台阶,那么第二次就是f(n-2)的问题。对于第二次跳也是如此,就是分别是f(n-2)和f(n-3)(对于第一次跳了1阶的情况下)、f(n-3)和f(n-4)(对于第一次跳了2阶的情况下),依次类推下去,成为一个递归。特别的,当n=1的时候,只有一种跳法(只跳一阶),当n=2的时候,有两种跳法(跳1阶跳两次,跳2阶跳一次)。实际上这就是一个斐波那契数列。

代码

int jumpFloor(int number) {
        if(number==1)
            return 1;
        else if(number==2)
            return 2;
        else
            return jumpFloor(number-1)+jumpFloor(number-2);  
    }

题目3 变态跳台阶

题目描述

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

题目解析

当一个青蛙跳上n级台阶有以下的情况:

n 情况数 情况
1 1 (1)
2 2 (1,1),(2)
3 4 (1,1,1),(1,2),(2,1),(3)
4 8 (1,1,1,1),(1,2,1),(1,1,2),(2,1,1),(2,2),(1,3),(3,1),(4)
…… …… ……
n 2*f(n-1) (1)

通过尝试,可以发现规律,当n>1的时候,f(n)=2*f(n-1)。

代码

 int jumpFloorII(int number) {
     if(number<1)
         return -1;
     else if(number==1)
         return 1;
     else
         return 2*jumpFloorII(n-1);
 }

题目4 矩形覆盖

题目描述

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

题目解析

对于这种问题,我们还是需要进行分析。

n 情况数 情况(括号中1为竖着,2为横着)
1 1 (1)
2 2 (1,1),(2,2)

当n=3的时候,我们发现,若固定了第三块砖的放置方式,那么前两块砖有两种放置方式(f(2));若固定了第二块和第三块的放置方式,则前一块砖有一种放置方式(f(1))。以此类推,可以得出f(n)=f(n-1)+f(n-2),当n>2的时候。

代码

int rectCover(int number) {
    if(number<=0)
        return 0;
    else if(number==1)
        return 1;
    else if(number==2)
        return 2;
    else
        return rectCover(number-1)+rectCover(number-2);
}

题目5 二进制中1的个数

题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

题目解析

思路很简单,利用与的特性:1&1=1,0&1=0就可以进行判断。

代码

 int  NumberOf1(int n) {
     int count=0;
     for(int i=0;i<32;i++)
     //32位是由int决定
     {
         if((n>>i)&1)
             count++;
     }
     return count;
 }

题目6 调整数组,使奇数位于偶数前面

题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

题目解析

其实这个可以借助于类似于冒泡法的思想,不过这样的复杂度有O(n2),并且空间复杂度也较高。因此可以使用下面的方法。借鉴了插入排序。

代码

void reOrderArray(vector<int> &array) {
        for(int i = 0;i < array.size();i++){
            for(int j = array.size()-1; j>i;j--){
                if(array[j]%2==1&&array[j-1]%2==0)
                    swap(array[j],array[j-1]);
            }
        }
    }
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 剑指offer
最后更新:2019年3月4日

yszhang

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

搜索
欢迎关注我的个人公众号
最新 热点 随机
最新 热点 随机
DEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架 奥地利匈牙利九日游旅程 论文阅读之Study of the General Kalman Filter for Echo Cancellation 小奥看房之鸿荣源珈誉府 杭州往返旅途及西溪喜来登和万怡的体验报告 2022年的第一篇碎碎念
奥地利匈牙利九日游旅程论文阅读之Study of the General Kalman Filter for Echo CancellationDEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架
《鸟哥的Linux私房菜》(基础篇)笔记整理(第7章)Part.3 [leetcode]Same Tree Python第四周内置函数等学习笔记 每日一感0921:秋风的味道 语音信号处理笔记(2) 作品声明
标签聚合
高中 linux 生活 Python python学习 Java 算法 鸟哥的linux私房菜 学习 leetcode
最近评论
davidcheung 发布于 6 个月前(02月09日) The problem has been fixed. May I ask if you can s...
tk88 发布于 6 个月前(02月07日) Hmm is anyone else having problems with the pictur...
cuicui 发布于 10 个月前(10月20日) :wink:
niming 发布于 11 个月前(09月19日) 同级校友,能刷到太巧了
davidcheung 发布于 2 年前(08月16日) 我得找一下我之前整理的word文档看一下,如果找到了我就更新一下这篇文章。
Nolan 发布于 2 年前(07月25日) 您的笔记非常有帮助。贴图不显示了,可以更新一下吗?
davidcheung 发布于 3 年前(06月19日) 到没有看webrtc的代码。现在主要在看我们公司的代码了。。。只是偶尔看一看webrtc的东西。。。
aobai 发布于 3 年前(03月13日) gain_change_hangover_ 应该是每三个block 只能够调整一次,这样保证每帧...
匿名 发布于 5 年前(12月30日) 烫
小奥 发布于 5 年前(12月12日) webRTC里面的NS本身我记得就是在C++里面呀

COPYRIGHT © 2025 小奥的学习笔记. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

陕ICP备19003234号-1

鲁公网安备37120202000100号