选择排序、冒泡排序、题

选择排序:

  从大到小排序:核心是把第一个数和其他位置的数依次比较,如果第一个小于其他位置的数就置换,内层循环结束后,第一个位置的数最小,第一个位置固定不在变化,第二个位置开始比较。外层循环是控制每次第i个数开始与其他位置的数比较固定下来,内层循环动态表示第i+1,i+2.. n<数组长度

public class Demo001 {
public static void main(String[] args) {
    int [] arr = new int[]{12,6,88,23,9};
    for (int i=0;i<arr.length-1;i++){
        for(int j=i+1;j<arr.length;j++){
            if(arr[i]<arr[j]){
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
    for(int i=0;i<arr.length;i++){
        System.out.println(arr[i]+" ");
    }
  }
}

  

冒泡排序:

   把数组按照从小到大排序,双重循环嵌套,外层循环每次把最大的数找出来,放到最后面,需要进行数组长度-1次,内层循环第一个数与第二个数比较,找出最大数,如果不同就置换位置,让第二个位置的数是俩者之大,在于第三个数比较。依次比较,选出最大数。内层循环第一次是从下标为0,到和下标为数组长度-1的数比较。在内层循环第一轮结束后,最后一个元素将不再参与比较。第二轮是从下标0到与数组长度-1-1比较。第三轮是0->数组长度-1-2,由动态变化可得

	int[] arr = {12,6,88,23,9};
        for(int i=0;i<arr.length;i++){
            for (int j=0;j<arr.length-1-i;j++){
                if (arr[j]>arr[j+1]){
                    int temp;
                    temp = arr[j+1];
                    arr[j+1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        for (int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }

  

一 获得特定数量硬币问题

小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。

魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币

魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币

小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币。

输入描述: 输入包括一行,包括一个正整数n(1 ≤ n ≤ 10^9),表示小易需要的魔法币数量。

输出描述: 输出一个字符串,每个字符表示该次小易选取投入的魔法机器。其中只包含字符'1'和'2'。

输入例子1: 10

输出例子1: 122

我的:

  

public class MagicMoney {
    public static void main(String[] args) {

        System.out.println("小易,请输入你需要多少个魔法币");
        Scanner sc = new Scanner(System.in);
       int total = sc.nextInt();
        StringBuffer s = chooseMachine(total);
        System.out.println(s.reverse());

    }
    public static StringBuffer chooseMachine(int total){
        StringBuffer sb = new StringBuffer();
        while (true){
            if (total>2){
                if (total%2==0){
                    sb.append("2");
                    total = (total-2)/2;
                }else{
                    sb.append("1");
                    total = (total-1)/2;
                }
            }else{
                if (total==1){
                    sb.append(1);
                }else if(total==2){
                    sb.append(2);
                }

                break;
            }

        }
        return sb;


    }
}

  参考答案的

public class Main {
	// 解题关键:明确魔法机器1只能产生奇数,魔法机器2只能产生偶数即可。我们从后往前一步一步推回去即可。

	public static void main(String[] args) {
		System.out.println("请输入要获得的硬币数量:");
		Scanner scanner = new Scanner(System.in);
		boolean flag = true;
		while (flag) {
			try {
				int coincount = scanner.nextInt();
				StringBuilder sb = new StringBuilder();
				while (coincount >= 1) {
					// 偶数的情况
					if (coincount % 2 == 0) {
						coincount = (coincount - 2) / 2;
						sb.append("2");
						// 奇数的情况
					} else {
						coincount = (coincount - 1) / 2;
						sb.append("1");
					}
				}
				// 输出反转后的字符串
				System.out.println(sb.reverse());
				flag=false;//程序结束
			} catch (InputMismatchException e) {
				System.out.println("输入数据类型不匹配,请您重新输入:");
				scanner.nextLine();
				continue;
			}
		}

	}
}

 

二 求“相反数”问题

为了得到一个数的"相反数",我们将这个数的数字顺序颠倒,然后再加上原先的数得到"相反数"。例如,为了得到1325的"相反数",首先我们将该数的数字顺序颠倒,我们得到5231,之后再加上原先的数,我们得到5231+1325=6556.如果颠倒之后的数字有前缀零,前缀零将会被忽略。例如n = 100, 颠倒之后是1.

输入描述: 输入包括一个整数n,(1 ≤ n ≤ 10^5)

输出描述: 输出一个整数,表示n的相反数

输入例子1: 1325

输出例子1: 6556

import java.util.Scanner;

public class reverse {
    public static void main(String[] args) {
        System.out.println("输入一个整数:");
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        int number1 = Integer.parseInt(s);
        int number = Integer.parseInt(new StringBuilder(s).reverse().toString());
        System.out.println(number1+number);
    }
}

  

 

posted @ 2020-05-03 08:42  西以北偏北  阅读(202)  评论(0编辑  收藏  举报