Java算法综合案例(一)

135 阅读6分钟

目录

  • 排序
  • 不死神兔
  • 猴子吃桃子
  • 爬楼梯

排序

  • 定义数组并存储一些女朋友对象,利用Arrays中的sort方法进行排序
    • 要求1:属性有姓名、年龄、身高。
    • 要求2:按照年龄的大小进行排序,年龄一样,按照身高排序,身高一样按照姓名的字母进行排序。

第一步:先来定义女朋友的JavaBean属性

private String name;
private int age;
private double height;

第二步:先来定义四个女朋友对象

// 2.创建三个女朋友的对象
GirFriend g1 = new GirFriend("bxiaohuihui", 19, 170);
GirFriend g2 = new GirFriend("axiaohuihui", 19, 170);
GirFriend g3 = new GirFriend("xiaoshishi", 18, 175);
GirFriend g4 = new GirFriend("xiaodandan", 18, 168);

第三步:定义数组存放对象信息

// 3.定义数组存储女朋友的信息
GirFriend[] arr = {g1, g2, g3,g4};

第四步:利用Arrays中的sort方法进行排序

// 4.利用Arrays中的sort方法进行排序
// Lambda表达式
Arrays.sort(arr,(o1,o2)->{
        // 按照年龄的大小进行排序,年龄一样就按照身高排序,身高一样就按照姓名的字母进行排序
        double temp = o1.getAge() - o2.getAge();
        temp = temp == 0 ? o1.getHeight() - o2.getHeight() : temp;
        temp = temp == 0 ? o1.getName().compareTo(o2.getName()) : temp;

        if(temp > 0){
            return 1;
        }else if(temp < 0){
            return -1;
        }else{
            return 0;
        }
    }
);

第五步:遍历数组

// 4.遍历一下数组的内容
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }

我们来运行看一下:

image.png

是不是先按照年龄来排序了呀,如果年龄一样就按照身高来排序,身高也一样的话最后是按照姓名的字母来进行排序。

完整代码:

public class Testdemo1 {
    public static void main(String[] args) {
        // 1.创建三个女朋友的对象
        GirFriend g1 = new GirFriend("bxiaohuihui", 19, 170);
        GirFriend g2 = new GirFriend("axiaohuihui", 19, 170);
        GirFriend g3 = new GirFriend("xiaoshishi", 18, 175);
        GirFriend g4 = new GirFriend("xiaodandan", 18, 168);

        // 2.定义数组存储女朋友的信息
        GirFriend[] arr = {g1, g2, g3,g4};
        System.out.println("原始数组");
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        System.out.println("--------------------------------");
        // 3.利用Arrays中的sort方法进行排序
        // Lambda表达式
        Arrays.sort(arr,(o1,o2)->{
                // 按照年龄的大小进行排序,年龄一样就按照身高排序,身高一样就按照姓名的字母进行排序
                double temp = o1.getAge() - o2.getAge();
                temp = temp == 0 ? o1.getHeight() - o2.getHeight() : temp;
                temp = temp == 0 ? o1.getName().compareTo(o2.getName()) : temp;

                if(temp > 0){
                    return 1;
                }else if(temp < 0){
                    return -1;
                }else{
                    return 0;
                }
            }
        );

        // 4.遍历一下数组的内容
        System.out.println("排序后的数组");
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

不死神兔

  • 有一个很有名的数学逻辑题叫做不死神兔问题。
    • 需求:有一对兔子,从出生后第三个月起每个月都生一对兔子小兔子长到第三个月后每个月又生一对兔子。
    • 假如兔子都不死,问第十二个月的兔子对数为多少?

这道有两个解法,我们先来看第一个:

  • 解法一:

第一步:创建有个数组

// 1.创建一个长度为12的数组
int[] arr = new int[12];

第二步:手动给0和1索引赋值

// 2.手动给0索引和1索引的数据进行复制
arr[0] = 1;
arr[1] = 1;

第三步:循环给剩余的数据进行赋值

// 3.利用循环给剩余的数据进行复制
for (int i = 2; i < arr.length; i++) {
    arr[i] = arr[i - 1] + arr[i - 2];
}

第四步:获取出最大索引的数据即可

// 4.获取最大索引上的数据即可
System.out.println(arr[11]);
  • 解法二:利用递归的方法
// 定义递归的方法
public static int getSum(int month) {
    if (month == 1 || month == 2) {
        return 1;
    } else {
        return getSum(month - 1) + getSum(month - 2);
    }
}

然后在测试类中传递月份过去给getSum方法:

// 调用递归方法
System.out.println(getSum(12));

我们来运行看一下:

image.png

怎么样,两种解法是不是都是一样的呀!

完整代码:

public class Testdemo2 {
    public static void main(String[] args) {
        // 解法1
        // 1.创建一个长度为12的数组
        int[] arr = new int[12];
        // 2.手动给0索引和1索引的数据进行复制
        arr[0] = 1;
        arr[1] = 1;
        // 3.利用循环给剩余的数据进行复制
        for (int i = 2; i < arr.length; i++) {
            arr[i] = arr[i - 1] + arr[i - 2];
        }
        // 4.获取最大索引上的数据即可
        System.out.println("第十二月一共有:" + arr[11] + "对兔子");


        // 解法2:调用递归方法
        System.out.println("第十二月一共有:" + getSum(12) + "对兔子");
    }

    // 定义递归的方法
    public static int getSum(int month) {
        if (month == 1 || month == 2) {
            return 1;
        } else {
            return getSum(month - 1) + getSum(month - 2);
        }
    }
}

猴子吃桃子

  • 需求:有一堆桃子,猴子第一天吃了其中的一半,并多吃了一个!以后每天猴子都吃当前剩下来的一半。 然后再多吃一个,第10天的时候(还没吃),发现只剩下一个桃子了,请问,最初总共多少个桃子?

这道题是不是还是继续用递归的写法呀,我们一起来看一下:

第一步:首先对传过来的天数进行异常判断

if (day <= 0 || day >= 11) {
    System.out.println("当前时间错误");
    return -1;
}

第二步:然后设置一下递归的出口

// 递归的出口
if (day == 10) {
    return 1;
}

第三步:书写递归的规律

// 每一天的桃子数量都是后一天数量加1,乘以2
return (getCount(day + 1) + 1) * 2;

第四步:调用递归方法遍历

// 调用递归查看每天吃了多少桃子
for (int i = 1; i <= 10; i++) {
    System.out.println("猴子第" + (i) + "天吃了:" + getCount(i) + "个桃子");
}

我们来运行看一下吧:

image.png

这个猴子第一天就吃了1534个桃子也是够牛逼的哈!

完整代码:

package sortTest;

public class Testdemo3 {
    public static void main(String[] args) {
        // 调用递归查看每天吃了多少桃子
        for (int i = 1; i <= 10; i++) {
            System.out.println("猴子第" + (i) + "天吃了:" + getCount(i) + "个桃子");
        }
    }

    public static int getCount(int day) {
        if (day <= 0 || day >= 11) {
            System.out.println("当前时间错误");
            return -1;
        }
        // 递归的出口
        if (day == 10) {
            return 1;
        }
        // 书写规律
        // 每一天的桃子数量都是后一天数量加1,乘以2
        return (getCount(day + 1) + 1) * 2;
    }
}

爬楼梯

  • 需求:可爱的小明特别喜欢爬楼梯,他有的时候一次爬一个台阶,有的时候一次爬两个台阶。
    • 如果这个楼梯有20个台阶,小明一共有多少种爬法呢?

还是使用递归的方法来编写规律:

public static int getCount(int n){
    if(n==1){
        return 1;
    }else if(n==2){
        return 2;
    }else{
        return getCount(n-1)+getCount(n-2);
    }
}

调用一下递归方法传台阶的数量过去计算并打印:

System.out.println(getCount(20));

我们来运行看一下:

image.png

完整代码:

public class Testdemo4 {
    public static void main(String[] args) {
        /*
          运算结果:
                1层台阶 1种爬法
                2层台阶 2种爬法
                7层台阶 21种爬法
        */
        System.out.println("一共有" + getCount(20) + "种爬法");
    }

    public static int getCount(int n){
        if(n==1){
            return 1;
        }else if(n==2){
            return 2;
        }else{
            return getCount(n-1)+getCount(n-2);
        }
    }
}

好啦,以上就是一些常用的算法案例,有什么不懂的可以在评论区互相探讨哟,我们下期不见不散!!!

==最后非常感谢您的阅读,也希望能得到您的反馈  ==