斐波那契数列

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

n<=39

思路:此题用递归会超内存,故直接循环。

代码:

  1. class Solution {
  2. public:
  3. int Fibonacci(int n) {
  4. if(n==0) return 0;
  5. if(n==1) return 1;
  6. int ans=0,temp1=0,temp2=1;
  7. for(int i=2;i<=n;i++){
  8. ans=temp1+temp2;
  9. temp1=temp2;
  10. temp2=ans;
  11. }
  12. return ans;
  13. }
  14. };

 跳台阶

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

思路:

对于本题,前提只有 一次 1阶或者2阶的跳法。

a.如果两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1);

b.假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)

c.由a\b假设可以得出总跳法为: f(n) = f(n-1) + f(n-2)

d.然后通过实际的情况可以得出:只有一阶的时候 f(1) = 1 ,只有两阶的时候可以有 f(2) = 2

e.可以发现最终得出的是一个斐波那契数列。

代码:

  1. class Solution {
  2. public:
  3. int jumpFloor(int n) {
  4. if(n==0) return 0;
  5. if(n==1) return 1;
  6. if(n==2) return 2;
  7. int ans=0,temp1=1,temp2=2;
  8. for(int i=3;i<=n;i++){
  9. ans=temp1+temp2;
  10. temp1=temp2;
  11. temp2=ans;
  12. }
  13. return ans;
  14. }
  15. };

  变态跳台阶

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

思路:每个台阶都有跳与不跳两种情况(除了最后一个台阶),最后一个台阶必须跳。所以共用2^(n-1)中情况,这里的一行就是通过位移做乘法得到2^(n-1)的结果(小技巧:2的n次方可以通过对1进行位移求)。

  1. class Solution {
  2. public:
  3. int jumpFloorII(int number){
  4. return 1<<--number;
  5. }
  6. };

  矩形覆盖

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

思路:对于大矩形来说,去掉一块小矩形,即是n-1的情况,而1块小矩形的添加只有一种,去掉2块小矩形,2块小矩形的添加也只有一种。因而递推方程为f(n)=f(n-1)+f(n-2).

代码:

  1. class Solution {
  2. public:
  3. int rectCover(int number) {
  4. if(number==0) return 0;
  5. if(number==1) return 1;
  6. if(number==2) return 2;
  7. return rectCover(number-1)+rectCover(number-2);
  8. }
  9. };

  二进制中1的个数

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

思路:JAVA直接使用toBinaryString二进制转换即可,C++可以考虑:如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。

举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。
即可得如下代码:
  1. class Solution {
  2. public:
  3. int NumberOf1(int n) {
  4. int cnt=0;
  5. while(n!=0){
  6. cnt++;
  7. n=n&(n-1);
  8. }
  9. return cnt;
  10. }
  11. };

  数值的整数次方

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

思路:直接用快速幂求解即可。

代码:

  1. class Solution {
  2. public:
  3. double Power(double base, int exponent) {
  4. double res=1.0;
  5. long long p=abs(exponent);
  6. while(p){
  7. if(p&1) res*=base;
  8. base*=base;
  9. p>>=1;
  10. }
  11. return (exponent>0)?res:1/res;
  12. }
  13. };

  

剑指offer7~10题的更多相关文章

  1. 剑指 offer 第一题: 二维数组中的查找

    打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣

  2. 剑指Offer编程题2——替换空格

    剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...

  3. 剑指Offer编程题1——二维数组中的查找

    剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...

  4. 剑指offer编程题Java实现——面试题10二进制中1的个数

    题目: 请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1,该函数输出2解法:把整数减一和原来的数做与运算,会把该整数二进制表示中的最低位的1变 ...

  5. 剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现

    用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具 ...

  6. 剑指offer编程题66道题 36-66

    36.两个链表的第一个公共节点 题目描述 输入两个链表,找出它们的第一个公共结点. 1.具有重合节点的两个链表是一个Y字性,用两个堆栈放这两个链表,从尾部开始遍历,直到遍历到最后一个重合节点. 这种算 ...

  7. 牛客网剑指offer刷题总结

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

  8. 剑指Offer-3~9题

    3. 数组中重复的数字 题目描述: 在一个长度为 \(n​\) 的数组里的所有数字都在 \(0​\) 到 \(n-1​\) 的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个 ...

  9. 剑指Offer-60~68题

    60. \(n\) 个骰子的点数 题目描述: 扔 \(n\) 个骰子,向上面的数字之和为 \(S\).给定 \(n\),请列出所有可能的 \(S\) 值及其相应的概率. 示例: 输入:n = 1 输出 ...

随机推荐

  1. JS a标签默认鼠标事件,导致无法修改input选中状态

    今天踩了一个坑

  2. python小总结4(文件)

    一.读文件 过程: a.打开文件:open() b.读取文件内容:read() readline() readlines() c.关闭文件:close() open(path,flag,encodin ...

  3. JS-3

    运算符 数学运算符 + - * / %(取模运算符) js内置一个对象叫Math,Math提供了很多关于计算的方法,常见的 // 随机数 console.log(Math.random()); // ...

  4. 软件151 王楚博 aodp

    一.AOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面编程. AOP(Aspect Orient Programming),作为面向对象编程的一种 ...

  5. c++常量指针和指针常量的区别

    int a:int * const p = &a: //指针常量,*p可以修改*p = 8:(OK) p不可以修改 p++(ERROR) int a,b:const int *p = & ...

  6. 自动调参库hyperopt+lightgbm 调参demo

    在此之前,调参要么网格调参,要么随机调参,要么肉眼调参.虽然调参到一定程度,进步有限,但仍然很耗精力. 自动调参库hyperopt可用tpe算法自动调参,实测强于随机调参. hyperopt 需要自己 ...

  7. wc.exe

    1 /* 2 * 没能实现的功能:wc.exe -s递归处理目录下符合条件的文件 3 * wc.exe -x 显示图形界面 4 * 5 * 6 * 实现的功能: wc.exe -c显示文件的字符数. ...

  8. 反射 day1

    1.Object objval = rs.getObject(fieldName);//如果数据库值为空时的返回值java中的null //这个如果是oracle数值型的数据的会返回的可能类型有很多, ...

  9. (转)ArcGIS Runtime for Android 使用异步GP服务绘制等值线

    关于基于Android上ArcGIS Server GP服务的调用,已经有前辈给出了很好的例子: http://blog.csdn.net/esrichinacd/article/details/92 ...

  10. java中的常用特殊字符

    1.转义字符反斜杠(\) 我们知道html中大都是双标签,如果在标签内想要输出带有标签结束符的文本都必须进行转义,html中是采用对应的字符替换,如<可用<替换 在java当中,我们要转义 ...