問題:老師給學(xué)生分蘋果,學(xué)生個數(shù)不定右核,年齡各不相同慧脱,要求老師根據(jù)學(xué)生年齡分蘋果,相鄰兩個同學(xué)蒙兰,年齡大的同學(xué)比年齡小的多分一個蘋果磷瘤,不允許給學(xué)生排序,請寫出相應(yīng)算法搜变。
public class PersonNew {
? ? int postion;//所在的位置
? ? int age;//年齡
? ? int apple;//分幾個蘋果
? ? public PersonNew(int postion, int age, int apple) {
? ? ? ? this.postion = postion;
? ? ? ? this.age = age;
? ? ? ? this.apple = apple;
? ? }
? ? public int getPostion() {
? ? ? ? return postion;
? ? }
? ? public void setPostion(int postion) {
? ? ? ? this.postion = postion;
? ? }
? ? public int getAge() {
? ? ? ? return age;
? ? }
? ? public void setAge(int age) {
? ? ? ? this.age = age;
? ? }
? ? public int getApple() {
? ? ? ? return apple;
? ? }
? ? public void setApple(int apple) {
? ? ? ? this.apple = apple;
? ? }
? ? @Override
? ? public boolean equals(Object obj) {
? ? ? ? if (obj instanceof PersonNew) {
? ? ? ? ? ? PersonNew person = (PersonNew) obj;
? ? ? ? ? ? if (person.age == this.age) {
? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
? ? ? ? } else {
? ? ? ? ? ? return false;
? ? ? ? }
}
}
public class Exc_1 {
? ? public static int COUNT = 50;//測試數(shù)據(jù)條數(shù)采缚,COUNT大于2
? ? public static void main(String[] args) {
? ? ? ? List data = new ArrayList();
? ? ? ? Random random = new Random();
? ? ? ? for (int i = 0; i < COUNT; ) {
? ? ? ? ? ? int age = random.nextInt(100) + 1;
? ? ? ? ? ? PersonNew pn = new PersonNew(i, age, 0);
? ? ? ? ? ? if (!data.contains(pn)) {
? ? ? ? ? ? ? ? data.add(pn);
? ? ? ? ? ? ? ? i++;
? ? ? ? ? ? }
}
? ? ? ? //查看初始化數(shù)據(jù)后的結(jié)果
// showInfo(data);
? ? ? ? boolean isBigger = true;//從第一個數(shù)和第二個數(shù)比較確定是正弦還是余弦
? ? ? ? if (data.get(0).getAge() > data.get(1).getAge()) {
? ? ? ? ? ? isBigger = true;
? ? ? ? } else {
? ? ? ? ? ? isBigger = false;
? ? ? ? }
? ? ? ? int step = 1;
? ? ? ? for (int i = 1; i < COUNT - 1; i++) {
? ? ? ? ? ? if (isBigger) {
? ? ? ? ? ? ? ? if (data.get(i).getAge() > data.get(i + 1).getAge()) {
? ? ? ? ? ? ? ? ? ? step = i;
? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? if (data.get(i).getAge() < data.get(i + 1).getAge()) {
? ? ? ? ? ? ? ? ? ? step = i;
? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
}
}
? ? ? ? //確定一點(封頂或谷底)的同學(xué)分到的蘋果 設(shè)置為1
? ? ? ? data.get(step).setApple(1);
? ? ? ? for (int i = step; i >= 1; i--) {
? ? ? ? ? ? if (data.get(i - 1).getAge() > data.get(i).getAge()) {
? ? ? ? ? ? ? ? data.get(i - 1).setApple(data.get(i).getApple() + 1);
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? data.get(i - 1).setApple(data.get(i).getApple() - 1);
? ? ? ? ? ? }
}
? ? ? ? for (int i = step; i < COUNT - 1; i++) {
? ? ? ? ? ? if (data.get(i + 1).getAge() > data.get(i).getAge()) {
? ? ? ? ? ? ? ? data.get(i + 1).setApple(data.get(i).getApple() + 1);
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? data.get(i + 1).setApple(data.get(i).getApple() - 1);
? ? ? ? ? ? }
}
? ? ? ? //showInfo(data);
//找出最小的值
? ? ? ? int minNum = data.get(0).getApple();
? ? ? ? for (int i = 1; i < COUNT; i++) {
? ? ? ? ? ? if (data.get(i).getApple() < minNum) {
? ? ? ? ? ? ? ? minNum = data.get(i).getApple();
? ? ? ? ? ? }
}
? ? ? ? int addNum = 1 - minNum;
? ? ? ? for (int i = 0; i < COUNT; i++) {
? ? ? ? ? ? data.get(i).setApple(data.get(i).getApple() + addNum);
? ? ? ? }
? ? ? ? showInfo(data);
? ? }
? ? private static void showInfo(List data) {
? ? ? ? StringBuffer sb = new StringBuffer();
? ? ? ? for (int i = 0; i < data.size(); i++) {
? ? ? ? ? ? sb.append("[" + data.get(i).getAge() + "," + data.get(i).getApple() + "]");
? ? ? ? }
? ? ? ? System.out.println(sb.toString());
? ? ? ? System.out.println("數(shù)據(jù)是否符合條件:"+validData(data));
? ? }
? ? //驗證數(shù)據(jù)是否符合條件
? ? private static boolean validData(List data) {
? ? ? ? boolean isValid = false;
? ? ? ? for (int i = 0; i < data.size() - 1; i++) {
? ? ? ? ? ? PersonNew pn1 = data.get(i);
? ? ? ? ? ? PersonNew pn2 = data.get(i + 1);
? ? ? ? ? ? if (Math.abs(pn1.getApple() - pn2.getApple()) == 1
? ? ? ? ? ? ? ? ? ? && pn1.getApple() > 0
? ? ? ? ? ? ? ? ? ? && pn2.getApple() > 0) {
? ? ? ? ? ? ? ? isValid = true;
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? isValid = false;
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
}
? ? ? ? return isValid;
? ? }
}