一、题目描述:
在蓝桥王国,数字的大小不仅仅取决于它们的数值大小,还取决于它们所形成的“封闭图形”的个数。
封闭图形是指数字中完全封闭的空间,例如数字 11、22、33、55、77 都没有形成封闭图形,而数字 00、44、66、99 分别形成了 11 个封闭图形,数字 88 则形成了 22 个封闭图形。值得注意的是,封闭图形的个数是可以累加的。例如,对于数字 6868,由于 66 形成了 11 个封闭图形,而 88 形成了 22 个,所以 6868 形成的封闭图形的个数总共为 33。
在比较两个数的大小时,如果它们的封闭图形个数不同,那么封闭图形个数较多的数更大。例如,数字 4141 和数字 1818,它们对应的封闭图形的个数分别为 11 和 22,因此数字 4141 小于数字 1818。如果两个数的封闭图形个数相同,那么数值较大的数更大。例如,数字 1414 和数字 4141,它们的封闭图形的个数都是 11,但 14<4114<41,所以数字 1414 小于数字 4141。 如果两个数字的封闭图形个数和数值都相同,那么这两个数字被认为是相等的。
小蓝对蓝桥王国的数字大小规则十分感兴趣。现在,他将给定你 nn 个数 a1,a2,…,ana1,a2,…,an,请你按照蓝桥王国的数字大小规则,将这 nn 数从小到大排序,并输出排序后结果。
输入格式
第一行包含一个整数 nn,表示给定的数字个数。
第二行包含 nn 个整数 a1,a2,…,ana1,a2,…,an,表示待排序的数字。
输出格式
输出一行,包含 nn 个整数,表示按照蓝桥王国的数字大小规则从小到大排序后的结果,每两个数字之间用一个空格分隔。
样例输入
3
18 29 6
样例输出
6 29 18
二、解题思路
利用数组存储每个数,计算出每个数的封闭图形个数,将该数字和对应的图形个数存入到数组中,arr[0]=num,arr[1]=封闭图形的个数,最后利用java的数组排序函数,编写排序的规则,先按封闭图形个数从小到大排序,封闭图形个数相等时,按照数字从小到大排序,直接解决。
import java.util.Scanner;
import java.util.Arrays;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n=scan.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=scan.nextInt();
}
int[][] array=fengbi(arr);
Arrays.sort(array,(a,b)->{
if(b[1]==a[1]) return a[0]-b[0];
return a[1]-b[1];
});
for(int i=0;i<n;i++){
System.out.print(array[i][0]+" ");
}
//在此输入您的代码...
scan.close();
}
public static int[][] fengbi(int[] arr){
int n=arr.length;
int[][] array=new int[n][2];
for(int i=0;i<n;i++){
array[i][0]=arr[i];
array[i][1]=getNums(arr[i]);
}
return array;
}
public static int getNums(int n){
int sum=0;
while(n>=1){
int num=n%10;
if(num==0||num==4||num==6||num==9){
sum+=1;
}else if(num==8){
sum+=2;
}
n=n/10;
}
return sum;
}
}