JAVA五道算法经典题

目录

1.sort 排序

解题:

2.

解法一:

解法二:递归(具体细节见之前初始递归)

3.猴子吃桃

解法一:

解法二:递归

4.爬楼梯

递归解题心得:


1.sort 排序

解题前先了解一个字符串比较的方法:

String s1 = "apple";
String s2 = "banana";
System.out.println(s1.compareTo(s2)); // 返回负数-1

String s3 = "banana";
String s4 = "bandy";
System.out.println(s3.compareTo(s4)); // ,因为前三个字符相同,比较a和r  -1

String s5 = "cherry";
String s6 = "cher";
System.out.println(s5.compareTo(s6)); // 返回长度差2

String类的compareTo方法是一个用于比较两个字符串的自然顺序的方法。返回的是 Ascii 码值相减的结果。

从第一个字符开始逐个对比不相等的字符的ASCII码,如果所有对应位置的字符都相等,则较短的字符串被认为“小于”较长的字符串,并返回长度差


解题:

Girl:

public class Girl {
    private String name;
    private int age;
    private int high;
    构造方法+set+get....

@Override
    public String toString() {
        return "Girl{name = " + name + ", age = " + age + ", high = " + high + "}";
    }
}

main:

public static void main(String[] args) {
    
    //创建对象,并初始化
    Girl g1 = new Girl("xiaoli", 18, 167);
    Girl g2 = new Girl("xiaowang", 20, 166);
    Girl g3 = new Girl("xiaohe", 19, 168);
    Girl g4 = new Girl("aaa", 18, 167);
    
	//对象装入Girl 类型对象的数组
    Girl[] arr = {g1, g2, g3, g4};
    
    //调用sort方法,使用匿名内部类的写法,并用lambda简化
    Arrays.sort(arr, (o1, o2) -> {
        //先按年龄排序
        int temp = o1.getAge() - o2.getAge();
        //如果年龄不一样(temp不会为0),直接按年龄排序
        //若年龄一样  则按身高  ,否则temp不变,并再次赋值给temp
        temp=temp==0?o1.getHigh()-o2.getHigh():temp;
        //若身高一样,则按名字排序, 否则temp不变,并再次赋值给temp
        temp=temp==0?o1.getName().compareTo(o2.getName()):temp;

        //因为底层逻辑只考虑temp的 正、负和0
        if (temp>0){
            return 1;
        }else if (temp<0){
            return -1;
        }else {
            return 0;
        }
    }
               );

    //记得重写toString再打印(底层调用toString)
    System.out.println(Arrays.toString(arr));

}

sort 排序底层逻辑见 Arrays 介绍


2.

引用图解:

这里以 为单位

JAVA五道算法经典题_第1张图片

可以发现规律:

从第三月起: 每个月份的兔子对数= 前两月兔子对数的和(斐波那契数列)

有两种解法:

解法一:



package com.lt2.test;

public class Test02 {
    public static void main(String[] args) {
//解法一:创建数组,用数组存储每月兔子对数
int arr[] = new int[12];
arr[0]=1;
arr[1]=1;
//从第三月起,放入前两月兔子对数
for (int i = 2; i 

解法二:递归(具体细节见之前初始递归)

public class Test02 {
    public static void main(String[] args) {
        
        System.out.println(fn(12));//144
        
    }
    //规律:
    //g(12)=g(11)+g(10)
    //g(11)=g(10)+g(9)
    //    ...
    //g(3)=g(2)+g(1)
    //g(2)=g(1)=1
    //出口:month
    public static int fn(int month){
        //出口
        if (month==2||month==1){
            return 1;
        }
        
        return fn(month-1)+ fn(month-2);
    }
}


3.猴子吃桃

解法一:

规律

day10: 1

day9:(day10+1)*2=4

day8:(day9+1)*2=10

...总共循环还原九次

int sum=1;//第十天的
//循环9次还原第一天
for (int i = 0; i <9 ; i++) {
    sum=(sum+1)*2;
}
System.out.println(sum);//1534

解法二:递归

public class Houzi {
    public static void main(String[] args) {
        
    //要求第一天
    System.out.println(fn(1));//1534
        
    }
    //规律
    //day10:1
    //day9:(day10+1)*2=4
    //day8:(day9+1)*2=10
    //    ...
    public static int fn(int number){
        if (number==10){
            return 1;
        }
        return (fn(number+1)+1)*2;
    }
}

4.爬楼梯

本质是找规律:

画图理解:

JAVA五道算法经典题_第2张图片

当台阶数为 4 阶时,我们其实可以不用在乎他中间是怎么爬的,

我们应该想在最后一步如何到达第 4 阶,一定是从第 3 阶或第 2 阶上来的、因此将到达第 3 阶和第 2 阶的所有爬法加在一起即可,=5

得出规律:某一阶数 爬法=它的前两阶爬法之和

可以看出是一个斐波那契数列

递归实现:

public class Test03 {
    public static void main(String[] args) {

        System.out.println(fn(20));//10946
    }


//		规律:
//    	fn(20)=fn(19)+fn(18)
// 		fn(19)=fn(18)+fn(17)
// .....
    public static int fn(int number){
        //出口
        if (number==1){
            return 1;//爬法
        }
        if(number==2){
            return 2;//爬法
        }
        return fn(number-1)+fn(number-2);
    }
}


若我们修改下题目,还能一次爬三阶

得出规律:某一阶数 爬法=它的前三阶爬法之和

public class Test03 {
    public static void main(String[] args) {


        System.out.println(fn(20));
    }

//		规律:
//    	fn(20)=fn(19)+fn(18)+fn(17)
// 		fn(19)=fn(18)+fn(17)+fn(16)
// .....
    public static int fn(int number){
        if (number==1){
            return 1;//爬法
        }
        if(number==2){
            return 2;//爬法
        }
        if (number==3){
            return 4;//爬法
        }
        return fn(number-1)+fn(number-2)+fn(number-3);
    }
}

答案: 121415


递归解题心得:

JAVA五道算法经典题_第3张图片

可根据规律解题

解题时:

  1. 将公式左边括号内的参数给定一个变量
  2. 然后我们根据参数之间的关系 可以将公式的右边 写成返回值。
  3. 如爬楼梯这一题:

JAVA五道算法经典题_第4张图片

  • 出口一般给出常数

你可能感兴趣的:(java,算法,数据结构)