【Java】面试题44:数字序列中某一位的数字
2019-03-29 14:48
387 查看
题目:
数字序列中某一位的数字
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数求任意位对应的数字。
主要思路:
举例分析,比如找第1001位数字,
1)1位数的数值有10个:0~9,数字为10×1=10个,显然1001>10,跳过这10个数值,在后面找第991(1001-10)位数字。
2)2位数的数值有90个:10~99,数字为90×2=180个,且991>180,继续在后面找第811(991-180)位数字。
3)3位数的数值有900个:100~999,数字为900×3=2700个,且811<2700,说明第811位数字在位数为3的数值中。由于811=270×3+1,所以第811位是从100开始的第270个数值即370的第二个数字,就是7。
按此规律,可求出其他数字。
关键点:位数的数值个数
时间复杂度:O(logn),按位数进行查找
package jianZhiOffer; /* * 面试题44:数字序列中某一位的数字 * 题目:数字以012345678901112131415.。。的格式序列化到一个 字符序列中。 * 再这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。 * 请写一个函数,求任意第n位对应的数字 */ public class Demo44 { public static void main(String[] args) { System.out.println(digitAtIndex(1001)); } private static int digitAtIndex(int index) { if(index<0) return -1; int digits = 1; //记录当前数字的位数 while(true) { int digitNumbers = countOfNumbersFor(digits); //当前位数的数值个数 //数值乘上它的位数等于数字个数 //比如,两位数有90个( 10-99),每个数值有2位数字,总数字个数为180 int countOfNumbers = digitNumbers*digits; //位数 if(index<countOfNumbers) { return digitAtIndex(index,digits); }else { //在下一位中查找 index -= countOfNumbers; digits++; } } } //digits位数的数字个数 //两位数有9*10=90个(10-99),三位数有9*100=900(100-999) private static int countOfNumbersFor(int digits) { if(digits==1) return 10; int count = (int)Math.pow(10, digits-1); return 9*count; } //输出对应的数 private static int digitAtIndex(int index,int digits) { //对应的数值 int number = beginNumberFor(digits) + index / digits; System.out.println(number); //数值右边开始算的位置 int indexFromRight = digits-index%digits; System.out.println(indexFromRight); //去除右边的indexFromRight-1个数字 for(int i=1;i<indexFromRight;i++) number /= 10; //求个位数字 return number%10; } //digits位数的第一个数字,两位数从10开始,三位数从100开始 private static int beginNumberFor(int digits) { if(digits==1) return 0; return (int)Math.pow(10, digits-1); } }
相关文章推荐
- 剑指Offer(第二版)面试题44:数字序列中某一位的数字
- 剑指Offer面试题41(Java版):和为s的两个数字VS和为s的连续正数序列
- 面试题:数字序列中某一位的数字
- 剑指Offer-44:数字序列中某一位的数字
- 算法--java实现将数字转换成人民币大写(迅雷面试题)
- 剑指Offer面试题41和为s的两个数字与和为s的连续正数序列,面试题42翻转单词顺序与左旋转字符串
- 剑指offer--面试题24:二叉搜索树的后序遍历序列--Java实现
- 剑指Offer面试题29(java版):数组中出现次数超过一半的数字
- 剑指offer 面试题41 递增数组中和为s的两个数字 | 和为s的连续整数序列
- Java自动计算表格某一数字列的和
- 数字序列中的某一位的数字
- [原]Java面试题-将字符串中数字提取出来排序后输出
- JAVA企业面试题精选 数据库41-44
- java面试题去除一个int整数的重复数字然后倒着输出
- 将数字序列逆序输出(java)
- 【面试题】在二元树中找出和为某一值的所有路径——Java实现
- 面试题41:和为s的两个数字VS和为s的连续正数序列
- Java,面试题,将阿拉伯数字转为中文
- Java自动计算表格某一数字列的和
- 剑指offer面试题54 表示数字的字符串(java实现)