菜鸟仓库是一个很大很神奇的地方,各种琳琅满目的商品整整齐齐地摆放在一排排货架上,通常一种品类的商品会放置在货架的某一个格子中,格子设有统一的编号,方便工人们挑选。有一天沐哲取菜鸟仓库参观,无意中发现第1个货架格子编码为1,第2-3个分别为1,2,第4-6个格子分别是1,2,3,第7-10个格子编号分别是1,2,3,4,每个格子编号都是0-9中的一个整数,且相邻格子的编号连在一起有如下规律 1|12|123|1234|…|123456789101112131415|…|123456789101112131415…n 这个仓库存放的商品品类非常丰富,共有1千万多个货架格子。沐哲很好奇,他想快速知道第k个格子编号是多少?
采用蛮力搜索的方法,逐步循环,直到找到第K位。用cnt计数器,记下迄今为止的仓库数目,一旦从cnt==K 那么返回当前的号码,即为第K个货架的编号。
注意:
1:对多位数字字符化;用字符串存储,同时 输出的编号也是字符的形式,
2:代码编写注意
- 数字转字符 Integer.toString(); 从控制台读数时的 Scanner 类,import java.util.Scanner;
- 多重循环的退出问题,找到cnt==K,时,return number; break 只能退出本循环,i,j循环怎么退呢?
- 答:在外层i,j 循环的判断语句中加一个 flag 判断
package leetcode;
import java.io.InputStream;
import java.util.Scanner;
public class numberKofRack {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.print("请输入K:");
Scanner scan = new Scanner(System.in);
int K = scan.nextInt();
char num = numberK(K);
System.out.print(num);
}
public static char numberK(int K){
if(K<=0)
return 0;
int cnt = 0;String s;char number = 0 ;int flag =0;
for(int i=1;i<= K && flag ==0;i++){
for(int j=1;j<=i && flag ==0;j++){
s = Integer.toString(j);
for(int n=0;n<s.length();n++){
cnt++;
if(cnt==K){
flag = 1;
number = s.charAt(n);
break;
}
}
}
}
return number;
}
}