Java代码——蓝桥杯 封闭图形个数

一、题目描述:
 

在蓝桥王国,数字的大小不仅仅取决于它们的数值大小,还取决于它们所形成的“封闭图形”的个数。

封闭图形是指数字中完全封闭的空间,例如数字 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;
    }
  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值