选择排序、冒泡排序、题
选择排序:
从大到小排序:核心是把第一个数和其他位置的数依次比较,如果第一个小于其他位置的数就置换,内层循环结束后,第一个位置的数最小,第一个位置固定不在变化,第二个位置开始比较。外层循环是控制每次第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:
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); } }