每日一题(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 个整数,表示按照蓝桥王国的数字大小规则从小到大排序后的结果,每两个数字之间用一个空格分隔。

思路

之前做过类似的,用数组o存储数字0-9的封闭图形数量。

这道题还涉及到一个排序问题,所以先按照数字本身排好序,再根据圆圈个数排序。

思路不难,挑战在于代码书写

import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
// #define int long long

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        int n = scan.nextInt();
        int[] o = {1,0,0,0,1,0,1,0,2,1};

        long[] a = new long[(int) (n+5)];
        long[] b = new long[(int) (n+5)];

        for(int i = 0; i < n; i ++ ) {
          a[i] = scan.nextLong();

        }

        Arrays.sort(a,0,(int)n);

        long temp = 0;
        int pd = 0;
        int sum = 0;
        int max = 0;

        for(int i = 0; i < n; i ++ ) {
          temp = a[i];
          sum = 0;
          while(temp > 0) {
            pd = (int) temp%10;
            sum += o[pd];
          
            max = Math.max(max, sum);
            b[i] = sum;
            temp/= 10;
          }

        }

        for(int i = 0; i <= max; i ++ ) {
          for(int j = 0; j < n; j ++ ) {
            if(b[j] == i) System.out.print(a[j] + " ");
          }
        }
        scan.close();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值