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