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