十二、常见算法和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<GirlFriend>() {@Overridepublic 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:(不死神兔)
有一个很有名的数学逻辑题叫做不死神兔问题,有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,加入兔子都不死,问:第十二个月的兔子对数为多少?
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(爬楼梯)
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);}