题目:走楼梯
小明在走楼梯,楼梯有n阶台阶,一次可以上1阶,2阶或者3阶,实现一个方法,计算小明有多少种走楼梯的方式
package louti;
import java.util.Scanner;
public class Floor {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in); //接受键盘输入的数据
while (true) {
int n=sc.nextInt();
int res=f(n);
System.out.println(res);
}
}
private static int f(int n) {
if(n==0) return 1;
if(n==1) return 1;
if(n==2) return 2;
return f(n-1)+f(n-2)+f(n-3); //递归,缩小n
}
}
c++
#include<iostream>
using namespace std;
static int f(int n) {
if(n==0) return 1;
if(n==1) return 1;
if(n==2) return 2;
return f(n-1)+f(n-2)+f(n-3); //递归,缩小n
}
int main(){
int n,res;
cin>>n; //接受键盘输入的数据
while (true) {
int res=f(n);
cout<<res<<endl;
cout<<endl;
}
return 0;
}
改造的二分法
题目:旋转数组的最小数字
把一个数组最开始的若干元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的旋转,该数组的最小值为1
代码思想;
static int min(int[] arr){
int begin=0;
int end=arr.length-1; //考虑没有旋转这种情况
if(arr[begin]<arr[end]) //如果数组前面的元素小于后面的数组
return arr[begin];
while (begin+1<end){ //begin和end指向相邻元素
int mid=begin+((end-begin>>1); //要么左侧有序,要么右侧有序
if(arr[mid]>=arr[begin]){ //左侧有序
begin=mid;
}
else=mid;
}
}
return 0;
int main() {
int[] arr={5,1,2,3,4};
int res=min(arr);
Assertions.assertThat(res).isEqualTo(1); //输出最小元素
arr=new int[]{2,3,4,5,6};
}