Codejam之Tidy Numbers

问题描述

8,123,555,224488这种数字以非递减的顺序排列的叫做tidy numbers

20,321,495,99999990这种不是

给一个值,要求输出该值之前的最后一个tidy number

这里写图片描述

问题解决

大数据集中的测试用例如下,如果将值逐次减一,判断是否符合要求太没有效率。

可以遍历数字串,找到第一个nums[i]>nums[i+1]的位置,将nums[i]的值减一,后面的值都赋值9

nums[i]的值减一后,其前面的值可能大于nums[i],再次检查。

也可以直接找i前面等于nums[i]的最左边的位置

811112333445578899
999999999999999999
430315219406019114
11333445538
10999999999
21233455667777788
839744037703188439

int[] nums = new int[aline.length()];
for(int i=0;i<aline.length();i++)
    nums[i]=aline.charAt(i)-48;

int index = check(nums,0,nums.length-1);
while(index!=-1){
    index = check(nums,0,index);
}

String res = "";
int start = 0;
//处理09999这种情况,把前面的0去掉
while(nums[start]==0){
    start++;
}
for(int i=start;i<nums.length;i++){
    res+=nums[i];
}   
writer.write("Case #"+k+": "+res+'\n');

check的实现

private static int check(int[] nums,int lo,int hi){
    int index = -1;
    for(int i=lo;i<hi;i++){
        if(nums[i]>nums[i+1]){
            nums[i]=nums[i]-1;
            for(int j=i+1;j<=hi;j++)
                nums[j]=9;
            index=i;
            break;
        }
    }
    return index;
}

1332
第一次check(0,3)后,返回的index=2
1329
check(0,2)后,返回index=1
1299
check(0,1),返回index=-1,终止循环

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值