【蓝桥杯】小蓝有很多数字卡片,每张卡片上都是数字0 到9。小蓝准备用这些卡片来拼一些数,他想从1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。小蓝想知道自己能从1 拼到多少?提示:

【问题描述】

小蓝有很多数字卡片,每张卡片上都是数字0 到9。
小蓝准备用这些卡片来拼一些数,他想从1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。
小蓝想知道自己能从1 拼到多少。
例如,当小蓝有30 张卡片,其中0 到9 各3 张,则小蓝可以拼出1 到10,但是拼11 时卡片1 已经只有一张了,不够拼出11。
现在小蓝手里有0 到9 的卡片各2021 张,共20210 张,请问小蓝可以从1拼到多少?
提示:建议使用计算机编程解决问题。

public static void main(String[] args) {
		// TODO Auto-generated method stub
        int[] numbers=new int[10];
        for(int i=0;i<numbers.length;i++) {
        	numbers[i]=2021;
        }
        boolean flag=true;
        int number=0;
        while(flag) {
        	//得到number里的每一位数字
        	char[] cha=String.valueOf(number).toCharArray();
        	for(int i=0;i<cha.length;i++) {
        		if(numbers[cha[i]-'0']>0) {//
        			numbers[cha[i]-'0']--;
        		}else {
        			flag=false;
        			break;
        		}
        	}
        	if(flag) {
        		number++;
        	}
        }
        System.out.println(number-1);
	}

cha[i] - '0' 是一个常见的字符操作,通常用于将字符表示的数字转换为相应的整数值。

在ASCII字符集中,数字字符 '0' 到 '9' 的ASCII码值是连续的,依次为 48 到 57。因此,当执行 cha[i] - '0' 时,它会将字符 '0' 的ASCII码值(48)从 cha[i] 对应字符的ASCII码值中减去,这样就得到了相应数字字符代表的整数值。

举个例子,假设 cha[i] 是字符 '5',执行 cha[i] - '0' 就相当于 53 - 48,结果是整数 5,即 '5' 的数值表示。

这种方法常用于将字符数组表示的数字转换为相应的整数值,例如将 "123" 这样的字符数组转换为整数 123。

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 小蓝有很多数字卡片每张卡片上都是数字0-9。 小蓝准备用这些卡片一些,他从1开始拼出,每一个, 就保存起来卡片不能用来其它了。 小蓝想知道自己能从1拼到多少。 例如,当小蓝有的时候。 ### 回答2: 小蓝可以预先将数字卡片按照从大到小的顺序排列,这样可以确保尽可能多地使用小数字卡片。同时,小蓝可以设定一个器,用来记录已经成功拼出的个。初始值为1,因为小蓝首先要将数字1拼出来。 接下来,小蓝可以按照以下的步骤逐个拼出: 1. 小蓝从拥有的数字卡片中找到能够拼出当前计器的卡片,如果没有对应的卡片,则说明小蓝无法继续往下,将当前计器的值记录下来,并停止的过程。 2. 如果找到了对应的卡片,则将该卡片使用掉,同时将当前计器的值加1,表示成功拼出一个更大的,继续循环执行步骤1。 通过以上的步骤,小蓝可以逐个拼出,并记录下能够拼出的最大,这就是小蓝能从1拼到的最大。 需要注意的是,并不是所有的数字卡片都能拼出数字,例如只有0和1的卡片。在实际操作中,还需要考虑到这些特殊情况。同时,需要注意防止卡片重复使用,避免出现重复的数字。 ### 回答3: 小蓝有数字卡片可以看成是一个有限的数字集合,里面有0到9这10个数字。那么小蓝想要从1开始,一个拼出正整数,那么显然,我们可以从最小的数字1开始,一位一位接上去,直到无法再组成新的数字为止。 我们可以用一个桶$bucket$来保存数字卡片,桶的下标代表卡片上的数字,桶的值代表卡片量。随着数字的不断接,我们需要不断更新桶的值,将已经用过的卡片减去1,并将新的数字对应的卡片量加上1。每当我们成功拼出一个新的数字,我们就将这个数字标记为已使用,不能再将这些数字卡片用于组成其他数字了。 具体操作流程如下: - 初始化桶:将所有数字量初始化为$10$。 - 从数字1开始,一位一位接: - 首先检查卡片库存是否足够,即桶中对应数字量是否大于$0$。 - 如果库存足够,将这些数字卡片用于接出当前的数字。 - 将拼出数字打上标记,表示已使用。 - 继续接下一个数字,直到无法再接为止。 - 统计已拼出数字,即为小蓝能从1开始拼出的最大正整数。 这样一来,我们便可以用一个简单的贪心算法完成小蓝的问题。由于接过程中每个数字只能用一次,因此每个数字只会被遍历一次,时间复杂度为$O(n)$,其中$n$为数字卡片量。同时,由于我们只用到了一个桶来保存数字卡片量,空间复杂度为$O(1)$,因此算法效率较高。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值