Codejam之Tidy Numbers

来源:互联网 发布:ipad下载软件付费 编辑:程序博客网 时间:2024/05/22 17:21

问题描述

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,终止循环