十二、常见算法和Lambda——五道经典算法题

十二、常见算法和Lambda——经典算法题

  • 练习一(按照要求进行排序)
  • 练习2:(不死神兔)
  • 练习3(猴子吃桃子)
  • 练习4(爬楼梯)


练习一(按照要求进行排序)

定义数组并存储一些女朋友对象,利用Arrays中的sort方法进行排序

  • 要求1:属性有姓名、年龄、身高
  • 要求2:按照年龄的大小进行排序,年龄一样,按照身高排序,身高一样按照姓名的字母进行排序(姓名中不要有中文或特殊字符)
package FinalTest.Test1;

import java.util.Arrays;

public class Test1 {
    public static void main(String[] args) {
        /*定义数组并存储一些女朋友对象,利用Arrays中的sort方法进行排序
         * 要求1:属性有姓名、年龄、身高
         * 要求2:按照年龄的大小进行排序,年龄一样,按照身高排序,身高一样按照姓名的字母进行排序(姓名中不要有中文或特殊字符)*/

        //0.创建三个女朋友对象
        GirlFriend gf1 = new GirlFriend("xiaoshishi", 18, 1.67);
        GirlFriend gf2 = new GirlFriend("xiaodandan", 19, 1.72);
        GirlFriend gf3 = new GirlFriend("xiaohuihui", 19, 1.78);
        GirlFriend gf4 = new GirlFriend("abc", 19, 1.78);

        //1.利用数组存储女朋友信息
        GirlFriend[] arr = {gf1, gf2, gf3, gf4};

        //2.利用Arrays中的sort方法进行排序
       /* Arrays.sort(arr, new Comparator() {
            @Override
            public int compare(GirlFriend o1, GirlFriend o2) {
                //按照年龄的大小进行排序,年龄一样,按照身高排序,身高一样按照姓名的字母进行排序
                double temp = o1.getAge() - o2.getAge();
                temp = temp == 0 ? o1.getHeight() - o2.getHeight() : temp;
                temp = temp == 0 ? o1.getName().length() - o2.getName().length() : temp;
                if (temp > 0) {
                    return 1;
                } else if (temp < 0) {
                    return -1;
                } else {
                    return 0;
                }
            }
        });*/

        //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().length() - o2.getName().length() : temp;
                    if (temp > 0) {
                        return 1;
                    } else if (temp < 0) {
                        return -1;
                    } else {
                        return 0;
                    }
                }
        );

        //3.展示一下数组中的内容
        System.out.println(Arrays.toString(arr));
    }
}

package FinalTest.Test1;

public class GirlFriend {
//    要求1:属性有姓名、年龄、身高
    private String name;
    private int age;
    private double height;

    public GirlFriend() {
    }

    public GirlFriend(String name, int age, double height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取
     * @return height
     */
    public double getHeight() {
        return height;
    }

    /**
     * 设置
     * @param height
     */
    public void setHeight(double height) {
        this.height = height;
    }

    public String toString() {
        return "GirlFriend{name = " + name + ", age = " + age + ", height = " + height + "}";
    }
}


练习2:(不死神兔)

有一个很有名的数学逻辑题叫做不死神兔问题,有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,加入兔子都不死,问:第十二个月的兔子对数为多少?
十二、常见算法和Lambda——五道经典算法题_第1张图片

public static void main(String[] args) {
        /*有一个很有名的数学逻辑题叫做不死神兔问题,有一对兔子,从出生第三个月起每个月都生一对兔子,
        小兔子长到第三个月后每个月又生一对兔子,加入兔子都不死,问:第十二个月的兔子对数为多少?*/

        //解法1:
        int res = method1(12);
        System.out.println("解法1 第十二个月的兔子对数是:" + res + " 只!");

        //解法2:(递归的方法)
        int res2 = getSum(12);
        System.out.println("解法2 第十二个月的兔子对数是:" + res2 + " 只!");
    }

    private static int getSum(int month) {
        if (month == 1 || month == 2) {
            return 1;
        } else {
            return getSum(month - 1) + getSum(month - 2);
        }
    }

    private static int method1(int month) {
        //0.创建一个长度为12的数组
        int[] arr = new int[month];

        //1.手动给 0 索引和 1 索引赋值
        arr[0] = 1;
        arr[1] = 1;

        //2.利用循环给剩余的索引赋值
        for (int i = 2; i < arr.length; i++) {
            arr[i] = arr[i - 1] + arr[i - 2];
        }

        //3.获取最大索引的数据
        return arr[arr.length - 1];
    }

练习3(猴子吃桃子)

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

 public static void main(String[] args) {
        /*
        有一堆桃子,猴子第一天吃了其中的一半,并多吃了一个!以后每天猴子都吃当前剩下来的一半,
        然后再多吃一个,第十天的时候(还没吃),发现只剩下一个桃子了,请问,最初总共多少个桃子?*/

        int res = getCount(1);
        System.out.println(res);
    }

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

        if (day == 10) {
            return 1;
        }

        return (getCount(day + 1) + 1) * 2;
    }

练习4(爬楼梯)

十二、常见算法和Lambda——五道经典算法题_第2张图片
十二、常见算法和Lambda——五道经典算法题_第3张图片

public static void main(String[] args) {
        //爬楼梯
        int res = getCount(20);
        System.out.println(res);
    }

    private static int getCount(int n) {
        if (n == 1) {
            return 1;
        }

        if (n == 2) {
            return 2;
        }
        return getCount(n - 1) + getCount(n - 2);
    }

你可能感兴趣的:(JAVA,算法,java)