1. 变态跳台阶

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

分析
跳一个n阶台阶的方法数:

  • 先跳一级,剩下的n-1级有f(n-1)种方式
  • 先跳两级,剩下的n-2级有f(n-2)种方式
  • 。。。
  • 先跳n-1级,剩下的1级有f(1)种方式
  • 直接跳n级
    故f(n) = f(n-1)+f(n-2)+….+f(1)种方式,而f(n-1) = f(n-2)+f(n-3)+…+f(1),即f(n) = f(n-1)+f(n-1) = 2*f(n-1)。
    f(1) = 1, f(2) = 2, f(3) = 4, …, f(n) = 2^(n-1)

代码

class Solution {
public:int jumpFloorII(int number) {return 1<<(number-1);}
};

2. 矩形覆盖

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

分析
先不考虑n多大,从最下边开始覆盖

  • 如果先横着覆盖一行,剩下的n-1行有f(n-1)种方式
  • 如果先用两块竖着覆盖两行,剩下的n-2行有f(n-2)种方式

在不考虑n多大的情况下,f(n) = f(n-1)+f(n-2),而f(n-1) = f(n-2)+f(n-3),以此类推,这是个斐波那契数列啊,f(1) = 1,f(2) = 2,迭代算下去就好

代码

class Solution {
public:int rectCover(int number) {int f[number+3];f[0] = 0;f[1] = 1;f[2] = 2;for(int i=3;i<=number;i++)f[i] = f[i-1]+f[i-2];return f[number];}
};

注:这道题要注意number==0的情况

3. 二进制中1的个数

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

分析
1. 朴素法:一位一位统计,慢
2. 4位查表法:把0~15分别有多少个1存储下来,把int数分为8块,每块4位,每块有多少1可以查表很快得到,然后把每一块1的个数加起来。
3. 8位查表法:同法2
4. 16位查表法;同法2

// 4位查表法
class Solution {
public:int  NumberOf1(int n) {int m[16] = {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4};return m[n&0xf] +m[(n>>4)&0xf] + m[(n>>8)&0xf] +m[(n>>12)&0xf] +m[(n>>16)&0xf] +m[(n>>20)&0xf] +m[(n>>24)&0xf] +m[(n>>28)&0xf];}
};

4. 数值的整数次方

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

分析

  1. 朴素法:一次一次乘,但是如果exponent过于大,效率低
  2. 快速幂:原理是二分的思想,如果要算a^2b,先算出a^b,两个a^b乘一下就是a^2b,可以用递归写,也可以用迭代写,当b特别大的时候,迭代内存消耗比递归小多了。
    迭代写法的思想:例如a^b,假设b的二进制形式是1001,则a^b=a^(1000)*a^(0001),括号括起来的是二进制形式,假设最低位位第1位,如果第一位为1,则需要乘一次a,如果第二位为1,则需要乘一次a^2,如果第三位为1,则需要乘一次a^4,。。。,如果第n为为1,则需要乘一次a^n,按照这样的思想写代码就可以了。

代码

class Solution {
public:double Power(double base, int exponent) {int b = abs(exponent);double ans = 1.0;while(b){if(b&1)ans = ans*base;base *= base;b >>= 1;}if(exponent < 0)return 1.0/ans;return ans;}
};

注:这道题要考虑指数可能是负数的情况,这种情况也好处理,只要检测到指数是负数,返回正数次幂的倒数就好了

5. 调整数组顺序使奇数位于偶数之前

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

分析

方法1:如果单纯是使奇数位于偶数之前,使用双指针,一个从左开始找偶数,一个从右开始找奇数,都找到了,交换即可,这道题重点就在于,要保证奇数和奇数、偶数和偶数之间的相对位置不变。所以这时候可以从左往右找偶数,找到一个偶数并且其右边是奇数,就将这个偶数和奇数交换,以此类推,但是如果中间有连续的好多个偶数,就会很麻烦
方法2:使用一个辅助数组,用空间换时间,复杂度O(n),遍历两次原数组,第一次将奇数全部复制到辅助数组中,第二次将所有偶数复制到辅助数组中,最后将辅助数组的数全部复制到原数组中

代码

class Solution {
public:void reOrderArray(vector<int> &array) {vector<int> tmp;for(int i=0;i<(int)array.size();i++)if(array[i]&1)tmp.push_back(array[i]);for(int i=0;i<(int)array.size();i++)if(!(array[i]&1))tmp.push_back(array[i]);for(int i=0;i<(int)tmp.size();i++)array[i] = tmp[i];}
};

6. 链表中倒数第k个结点

题目描述
输入一个链表,输出该链表中倒数第k个结点。

分析
用两个指针,第一个指针在前边走,当第一个指针走到正数第k个结点,要走向第k+1个结点时,第二个指针开始往前走,第一个指针走到头,第二个指针所指的结点就是倒数第k个结点。具体细节在纸上画一画就清晰了

代码

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};*/
class Solution {public:ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {int count = 0;ListNode* pre;ListNode* cur;pre = pListHead;cur = pListHead;while(pre){if(count == k)break;count++;pre = pre->next;}while(pre){count++;pre = pre->next;cur = cur->next;}if(count < k)return NULL;return cur;}
};

注:这道题要注意,k比结点数多的情况要返回NULL

7. 反转链表

题目描述
输入一个链表,反转链表后,输出新链表的表头。

分析
创建新链表,每次插入元素都往头插,如果是不带头结点的链表,比较难插,可以创建一个带头结点的链表,最后返回头结点->next

代码

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};*/
class Solution {
public:ListNode* ReverseList(ListNode* pHead) {ListNode* head = new ListNode(0);ListNode* cur = pHead;while(cur){ListNode* tmp = new ListNode(cur->val);tmp->next = head->next;head->next = tmp;cur = cur->next;}return head->next;}
};

8. 合并两个排序的链表

题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

分析
创建一个新的链表,以归并排序的合并的方式向链表中添加元素

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};*/
class Solution {
public:ListNode* Merge(ListNode* pHead1, ListNode* pHead2){ListNode* head = new ListNode(0);ListNode* cur1 = pHead1, * cur2 = pHead2;ListNode* cur = head;while(cur1 && cur2){if(cur1->val < cur2->val){cur->next = new ListNode(cur1->val);cur = cur->next;cur1 = cur1->next;}else{cur->next = new ListNode(cur2->val);cur = cur->next;cur2 = cur2->next;}}while(cur1){cur->next = new ListNode(cur1->val);cur = cur->next;cur1 = cur1->next;}while(cur2){cur->next = new ListNode(cur2->val);cur = cur->next;cur2 = cur2->next;}return head->next;}
};

9. 树的子结构 还没做对

题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

分析
从B的根节点开始dfs,如果当前节点和A的根节点一样,判断当前节点的左子树和A的左子树是否一样、右子树和A的右子树是否一样,但是要注意,要设置回溯,确保每一个跟A的根节点相同的节点都有机会作为根节点

代码

剑指offer的题目相关推荐

  1. 剑指offer有python版吗_剑指Offer算法类题目[Python版]

    标签:重复   作用   coding   面试   medium   mba   none   fas   utf-8 面试题012 数值的整数次方 解题思路1 考虑所有情况,循环连乘 代码: de ...

  2. 《剑指offer》题目说明

    剑指offer推荐刷题地址: Leetcode: https://leetcode-cn.com/problemset/lcof (官方授权) 牛客网:https://www.nowcoder.com ...

  3. 《剑指 Offer》题目汇总

    文章目录 1. 数组 2. 链表 3. 栈和队列 4. 哈希表 5. 字符串 6. 树 7. 堆 8. 回溯和深度优先搜索 9. 递归和循环 10. 双指针 11. 动态规划 12. 贪心算法 13. ...

  4. 《剑指Offer》题目:树的子结构

    题目描述:树的子结构 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题目分析:此题可以拆成两题,1.在二叉树中查找是否存在某个结点:2.判断两个二叉树是否 ...

  5. 【剑指offer】题目二

    //实现一个函数:把字符串中的每个空格替换成"%20".例如输入"We are happy."则输出"We%20are%20happy." ...

  6. 《剑指Offer》题目:合并两个排序的链表

    题目描述:输入两个单调递增的链表list1,list2,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析: 1.对于链表题目,首先考虑边界情况,即链表为空的情况,提升代码 ...

  7. 剑指offer题目及答案

    剑指offer 最近在牛客网上刷剑指offer的题目,现将题目和答案总结如下: 1. 二维数组的查找 2. 替换空格 3. 从尾到头打印链表 4. 重建二叉树 5. 用两个栈实现队列 6. 旋转数组的 ...

  8. Java算法:牛客网Java版剑指Offer全套算法面试题目整理及电子档,Java算法与数据结构面试题,面试刷题、背题必备!牛客网剑指offer

    剑指offer(java版) 牛客网Java版剑指Offer全套题目67道 资源来源于网络 目录 1.二维数组中的查找 2.替换空格 3.从尾到头打印链表 4.重建二叉树 5.用两个栈实现队列 6.旋 ...

  9. 【前端js】实现剑指offer|leetcode(二)——数组题目集合

    文章目录 一.数组去重 1. 对排序数组去重(leetcode 26. 删除排序数组中的重复项) 2. 检查是否存在重复元素(leetcode 217. 存在重复元素) 3. 检查相邻k个元素是否存在 ...

最新文章

  1. TOP语句与Order By语句
  2. 帝国cms微信小程序算命小程序开发之指纹算命实现方法
  3. 【原创】DevExpress控件GridControl中的布局详解
  4. 【过程改进】 windows下jenkins常见问题填坑
  5. 24、C++ Primer 4th 笔记,面向对象编程(2)
  6. c语言中 printf(quot;nquot;),关于C语言 printf(quot;%d\nquot;,printf(quot;%dquot;,printf(quot;%dquot;...
  7. DDD理论学习系列(12)-- 仓储
  8. asp.net中RegularExpressionValidator控件中正则表达式用法
  9. java list 超出范围_java-列索引超出范围:2,列数1
  10. 微信、企业微信和支付窗 SDK 三合一,JeeWx-api 1.2.0 版本发布
  11. jquery 事件冒泡的介绍以及如何阻止事件冒泡
  12. java collections读书笔记(3) vector(2)
  13. SVN工作笔记002---svn提示上次操作有误,请执行cleanup
  14. AVL平衡树的插入例程
  15. COVID-19知识图谱问答系统(基于REFO)
  16. php 字符编码转换
  17. Android连接数据库的问题
  18. matlab遗传算法实例crtrp,遗传算法实例参考.ppt
  19. 0行代码,实现植物大战僵尸脚本
  20. Elasticsearch:如何制作 GeoJSON 文件并进行地理位置搜索

热门文章

  1. 工业机器人——4 正运动学(台大机器人学学习笔记)
  2. echarts图表截图保存成word文件的方法
  3. Github入门级错误(提交一直提示输入用户名和密码、公钥等)
  4. 教程 | 学好简笔画,再学画漫画
  5. VulnHub渗透测试实战靶场 - POTATO (SUNCSR): 1
  6. 继 Flash,Adobe Shockwave 也将完全退出历史舞台
  7. “揭秘”2020牛年春晚,用了这么多新技术,节目还是不尽如人意!
  8. 机器学习算法-决策树理论
  9. 全新的 SHA-3 加密标准 —— Keccak
  10. 寫了快一天的discoverer的folder