classSolution {publicintcountDigitOne(int n) {// digit 是「位因子」int digit =1;int ans =0;// 当前位int cur = n %10;// cur之前的所有高位int high = n /10;// cur之后会的所有低位int low =0;// 从最低位一直循环遍历到最高位while (high !=0|| cur !=0) {// cur为0时,结果只由高位决定,为什么呢,看k佬,找规律太难了我不会555if (cur ==0) ans += high * digit;// cur为1时,结果由高低位一起决定elseif (cur ==1) ans += high * digit + low +1;// cur为其他数字时,结果只由高位决定else ans += (high +1) * digit;// 更新cur hight low low += cur * digit; cur = high %10; high /=10; digit *=10; }return ans; }}
3.2 Kotlin
classSolution {funcountDigitOne(n: Int): Int {// digit 是「位因子」var digit =1var ans =0// 当前位var cur = n %10// cur之前的所有高位var high = n /10// cur之后会的所有低位var low =0// 从最低位一直循环遍历到最高位while (high !=0|| cur !=0) {// cur为0时,结果只由高位决定,为什么呢,看k佬,找规律太难了我不会555if (cur ==0) ans += high * digitelseif (cur ==1) ans += high * digit + low +1else ans += (high +1) * digit// cur为其他数字时,结果只由高位决定// cur为1时,结果由高低位一起决定// 更新cur hight low low += cur * digit cur = high %10 high /=10 digit *=10 }return ans }}