0
点赞
收藏
分享

微信扫一扫

微软面试题-天天做-第30题

烟中雯城 2022-07-28 阅读 74


30.在从1到n的正数中1出现的次数(数组)
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。

例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。
分析:这是一道广为流传的google面试题。

 

 

package com.microsoft;

import java.util.Arrays;

public class OneCount {

public static void main(String[] args) {
int input=121;
int value=input;
int size=0;
while(true){
if(value==0){
break;
}
size++;
value=value/10;

}
value=input;
int [] positionValue=new int[size];
int i=0;
while(true){
if(value==0){
break;
}
int v=value%10;
positionValue[i++]=v;
value=value/10;
}
int sum=input;
int length=positionValue.length;
int l=length*(length-1)/2;

System.out.println(recrusiveComputer(positionValue));


}

public static int recrusiveComputer(int[]position){
if(position.length==1){
return 1;
}
if(position[position.length-1]==1){
int []newPosition=Arrays.copyOfRange(position, 0, position.length-1);
for(int i=0;i<newPosition.length;i++){
newPosition[i]=9;
}
int []newPosition2=Arrays.copyOfRange(position, 0, position.length-1);
String value="";
for(int i=newPosition2.length-1;i>=0;i--){
value+=newPosition2[i];
}
int v=Integer.parseInt(value)+1;
//int c=v-recrusiveComputer(newPosition2)+1;
return recrusiveComputer(newPosition)+recrusiveComputer(newPosition2)+v;
}else{
int []newPosition=Arrays.copyOfRange(position, 0, position.length-1);
for(int i=0;i<newPosition.length;i++){
newPosition[i]=9;
}
int []newPosition2=Arrays.copyOfRange(position, 0, position.length-1);
String value="";
for(int i=newPosition.length-1;i>=0;i--){
value+=newPosition[i];
}
int v=Integer.parseInt(value)+1;
//int c=v-recrusiveComputer(newPosition)+1;
return (position[position.length-1]-1)*recrusiveComputer(newPosition)+recrusiveComputer(newPosition)+v+recrusiveComputer(newPosition2);
}
}


}

 

 

 

 

 

举报

相关推荐

0 条评论