class Solution {
public int countDigitOne(int n) {
int bit = 1;
int sum = 0;
for(int i=weishu-1;i>=0;i--) {
int low = n%bit;
int high = n/bit;
int cur = high%10;
high /= 10;
if(cur >1) {
sum+=(high+1)*bit;
}else if(cur ==1){
sum+=high*bit+(low+1);
}else {
sum+=high*bit;
}
bit = 10*bit;
}
return sum;
}
}
class Solution {
public:
int countDigitOne(int n) {
// cur = (n / bit) % 10
// low = n % bit
// high = n / bit / 10
// cur > 1 : (high + 1) * bit
// cur == 1 : (high * bit) * (low + 1)
// cur == 0 : high * bit
long long bit = 1;
long long sum = 0;
while(bit <= n){
long long cur = (n / bit) % 10;
long long low = n % bit;
long long high = n / bit / 10;
if(cur > 1){
sum += (high + 1) * bit;
}
else if(cur == 1){
sum += (high * bit) + low + 1;
}
else{
sum += high * bit;
}
bit *= 10;
}
return sum;
}
};
class Solution {
public int countDigitOne(int n) {
long bit = 1;
long sum = 0;
while(bit <= n){
long cur = (n/bit)%10;
long low = n % bit;
long high = n / bit / 10;
if(cur >1){
sum += (high + 1) * bit;
}else if(cur == 1){
sum += (high * bit) + (1 + low);
}else {
sum += high * bit;
}
bit = bit * 10;
}
return (int)sum;
//
}
}
class Solution {
public int countDigitOne(int n) {
// 几个变量计算:cur = (n/bit)%10, low = n % bit, high = n / bit / 10
// 几个公示
// cur > 1 => (high + 1) * bit
// cur 1 => (high * bit) + (1 + low)
// cur = 0 => high * bit
long bit = 1;
long sum = 0;
while(bit <= n){
long cur = (n/bit)%10;
long low = n % bit;
long high = n / bit / 10;
if(cur > 1){
sum += (high + 1) * bit;
}else if(cur == 1){
sum += (high * bit) + (1 + low);
}else{
sum += high * bit;
}
bit = bit * 10;
}
return (int)sum;
}
class Solution {
public int countDigitOne(int n) {
//计算数字1——countDigitOne
//研究数学规律。
int high = n / 10, cur = n % 10, low = 0, digit = 1, res = 0;
while(high != 0 || cur != 0){
if(cur == 0) res += digit * high;
else if(cur == 1) res += digit * high + low + 1;
else res += digit * (high + 1);
low += cur * digit;
cur = high % 10;
high /= 10;
digit *= 10;
}
return res;
}
}
func countDigitOne(n int) int {
//三种情况
//1. cur > 1 ==> (high + 1) * bit
//2. cur = 1 ==> (high*bit) + (1+low)
//3. cur = 0 ==> high * bit
//算数位
var bit int64 = 1
//个数
var sum int64 = 0
for bit <= int64(n) {
//当前位的值
cur := (int64(n) / bit) % 10
low := int64(n) % bit
high := int64(n) / (bit * 10)
if cur > 1 {
sum += (high + 1) * bit
} else if cur == 1 {
sum += (high*bit) + (1+low)
} else {
sum += high * bit
}
bit *= 10
}
return int(sum)
}
共以下 8 个回答
时间复杂度:O(logn)
空间复杂度:O(1)
c++ 运用数论解题
class Solution {
public:
int cuttingRope(int n)
{
if(n1||n2)
return 1;
if(n3)
return 2;
int s=1;
while(n>4)
s=3,n-=3;
return sn;
};
如果没看过,感觉很难想到(只想到暴力解)
时间复杂度:O(logn)
额外空间复杂度:O(1)
class Solution {
public int countDigitOne(int n) {
// 几个变量计算:cur = (n/bit)%10, low = n % bit, high = n / bit / 10
// 几个公示
// cur > 1 => (high + 1) * bit
// cur 1 => (high * bit) + (1 + low)
// cur = 0 => high * bit
}
7.28
Day19:下面是代码