U型数字
最近蒜头君喜欢上了U型数字,所谓U型数字,就是这个数字的每一位先严格单调递减,后严格单调递增。比如 212 就是一个U型数字,但是 333, 98, 567, 31313,就不是U型数字。
现在蒜头君问你,[1,100000]有多少U型数字?
提示:请不要输出多余的符号。
结果:
8193
思路:
因为在100以内的数字每一位,只能是单调递增或者单调递减,所以100以内的数字不用考虑了,可以节省点时间。
U型:就是这个数字的每一位先严格单调递减,后严格单调递增,简单的说就是去任意一个点,左边的点比这个点大,右边的点也比这个点大。
而且还要注意一点,如果相邻的两位数相等时,则不具有单调性(单调递增或递减)。
代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int[] arr = new int[6];
int cnt=0;
for(int i=101;i<100000;i++){//100之内只能单调递增或者单调递减
int t=i;
int flag=0;
while(t!=0){//取数字的每一位
arr[flag]=t%10;
t/=10;
flag++;
}
flag--;//实际只有flag-1个 ,因为上面的代码最后++了
int s=0;//用来标记
for(int j=1;j<flag;j++){//判断先递减后递增
if(arr[j]-arr[j-1]<0 && arr[j+1]-arr[j]>0){//先递减后递增
s++;
}
if(arr[j]-arr[j-1]>0 && arr[j+1]-arr[j]<0){//先递增后递减
break;
}
if(arr[j]==arr[j-1]){//如果相邻的两个数相等,则不满足单调性
break;
}
if(j==flag-1){//判断最后一对
if(arr[j+1]==arr[j]){
break;
}
}
if(s>1){//有两个或以上的先递减后递增
break;
}
if(j==flag-1 && s==1){
cnt++;
}
}
}
System.out.println(cnt);
}
}