博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法学习之剑指offer(二)
阅读量:5113 次
发布时间:2019-06-13

本文共 2890 字,大约阅读时间需要 9 分钟。

题目1

题目描述

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

import java.util.Stack;public class Solution {    Stack
stack1 = new Stack
(); Stack
stack2 = new Stack
(); public void push(int node) { stack1.push(node); } public int pop() { if(stack2.empty()) A_to_B(stack1,stack2); return stack2.pop(); } public void A_to_B(Stack
A,Stack
B){ if(A.empty()) throw new RuntimeException("队列为空"); while(!A.empty()){ B.push(A.pop()); } }}
题目2

题目描述

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

这是一道二分查找的变形的题目。

旋转之后的数组实际上可以划分成两个有序的子数组:前面子数组的大小都大于后面子数组中的元素

注意到实际上最小的元素就是两个子数组的分界线。本题目给出的数组一定程度上是排序的,因此我们试着用二分查找法寻找这个最小的元素。

import java.util.ArrayList;public class Solution {    public int minNumberInRotateArray(int [] array) {                if(array.length==0)            return 0;         if(array.length==1)            return array[0];            	int low = 0;        int high = array.length-1;                while(low
array[high]) low=mid+1; else if(array[mid]==array[high]) low++; else high=mid; } return array[low]; }}
题目3

题目描述

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

n<=39

public class Solution {    public int Fibonacci(int n) {		if(n<=0)            return 0;                if(n==1||n==2)            return 1;                return Fibonacci(n-1)+Fibonacci(n-2);    }}
题目4

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
public class Solution {    public int JumpFloor(int target) {		         if(target<=0)            return 0;                if(target==1)            return 1;                if(target==2)       		return 2;                return JumpFloor(target-1)+JumpFloor(target-2);    }}
题目5

题目描述(变态跳台阶)

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

跳1级,剩下n-1级,则剩下跳法是f(n-1)

跳2级,剩下n-2级,则剩下跳法是f(n-2)

所以f(n)=f(n-1)+f(n-2)+...+f(1)

因为f(n-1)=f(n-2)+f(n-3)+...+f(1)

所以f(n)=2*f(n-1)

public class Solution {    public int JumpFloorII(int target) {         if(target<=0)            return 0;                if(target==1)            return 1;                if(target==2)       		return 2;                return 2*JumpFloorII(target-1);    }}
题目6

题目描述

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

public class Solution {    public int RectCover(int target) {      if(target  <= 0){            return 0;        }         if(target == 1){            return 1;        }else if(target == 2){            return 2;        }else{            return RectCover((target-1))+RectCover(target-2);        }    }}

转载于:https://www.cnblogs.com/chz-blogs/p/9380934.html

你可能感兴趣的文章
timeline时间轴进度“群英荟萃”
查看>>
python map函数用法
查看>>
ios之申请后台延时执行和做一个假后台的方法(系统进入长时间后台后,再进入前台部分功能不能实现)...
查看>>
编码命名规范
查看>>
耿丹16-1上半学期助教总结
查看>>
python if else elif statement
查看>>
网络编程
查看>>
文本隐藏(图片代替文字)
查看>>
three.map.control
查看>>
二叉树的深度
查看>>
java面试题
查看>>
提高码力专题(未完待续)
查看>>
IOS第17天(3,Quartz2D画板和画线)
查看>>
pair的例子
查看>>
前端框架性能对比
查看>>
@property中 retain 详解
查看>>
java8 stream初试,map排序,list去重,统计重复元素个数,获取map的key集合和value集合...
查看>>
Python爬虫个人记录(四)利用Python在豆瓣上写一篇日记
查看>>
jdk8 Function
查看>>
第二次作业
查看>>