数学问题,今天没有耐心做题。。
思路:之前做过一道题是分成3越多越好,这里类似,但要考虑4 的问题
public int cuttingRope(int n) {
if(n == 2 || n==3)
return n-1;
long sum = 1;
while (n>4){
sum *= 3;
sum = sum%1000000007;
n -= 3;
}
return (int)(sum*n%1000000007);
}
思路:自己有点缕不明白,看了评论区有点明白了。注意考虑当前位置=1、>1、<1三种情况
//以 3 1 0 1 5 9 2 举例 /* *计算从1-n出现1的总次数 *就是计算1-n所有整数 个位+十位+百位+..为1的总和 *下面三个例子,分别对应的位元素 大于1,等于1,等于0 三种情况 *例一:把百位的5固定 3101 5 92 * 我们把百位设为1,5前面可以取0-3101,5后面可以取0-99 * 共有(3101 + 1)* 100(规律是百位即99 + 1)种组合使百位为1 * *例二:把千位的1固定 310 1 592 * 我们把千位设为1,这里可以分两种情况: * 当1前面取310,1后面可以取0-592 * 当1前面可以取0-309,1后面可以取0-999 * 共有(309 + 1)* 1000(规律是千位即999 + 1)+(592 + 1)种组合使千位为1 *例三:把万位的0固定 31 0 1592 * 把万位设为1, 0前面可以取0-30,0后面可以取0-9999 * 共有(30 + 1)* 10000(规律是万位即9999 + 1)种组合使万位为1 *我们可以分别计算一个数的个位百位...对应的组合数,最后相加 */
public int countDigitOne(int n) {
long base = 1;
int count = 0;
while (base <= n){
int low = (int)(n%base);
int high = (int) (n/base);
int cur = high%10;
high /= 10;
if (cur > 1){
count += (high+1)*base;
}else if (cur == 1){
count += high*base +(low+1);
}else {
count += high*base;
}
base *= 10;
}
return count;
}
思路:没耐心好好看,改天看
数字范围 数量 位数 占多少位 1-9 9 1 9 10-99 90 2 180 100-999 900 3 2700 1000-9999 9000 4 36000 ... 例如 2901 = 9 + 180 + 2700 + 12 即一定是4位数,第12位 n = 12; 数据为 = 1000 + (12 - 1)/ 4 = 1000 + 2 = 1002 定位1002中的位置 = (n - 1) % 4 = 3 s.charAt(3) = 2;
public int findNthDigit(int n) {
int digit = 1; // n所在数字的位数
long start = 1; // 数字范围开始的第一个数
long count = 9; // 占多少位
while(n > count){
n -= count;
digit++;
start *= 10;
count = digit * start * 9;
}
long num = start + (n - 1) / digit;
return Long.toString(num).charAt((n - 1) % digit) - '0';
}
475

被折叠的 条评论
为什么被折叠?



