leetCode-Record icon indicating copy to clipboard operation
leetCode-Record copied to clipboard

面试题43. 1~n整数中1出现的次数

Open fireairforce opened this issue 5 years ago • 0 comments

这题还挺不好写的,找规律吧= = 具体可以看代码实现:

const solve = (n) => {
    let sum = 0;
    let mul = 1;
    let left = n;
    let right = 0;
    if (!n) {
        return 0;
    }
    while(left > 0) {
        let digit = left % 10;
        left = Math.floor(left / 10);
        if(digit === 1) {
            sum += left * mul;
            sum += right + 1;
        } else if(digit < 1 ) {
            sum += left * mul;
        } else {
            sum += (left + 1) * mul;
        }
        right += digit * mul;
        mul *= 10;
    }
    return sum;
}

console.log(solve(13));

其实如果找数字n也可以写个板子出来:

const solve = (n, x) => {
  let cnt = 0
  let mul = 1
  let left = n
  let right = 0
  if (n == 0) {
    return x < 1 ? n : 0
  }
  while (left > 0) {
    let digit = left % 10
    left = Math.floor(left / 10)
    if (digit == x) {
      cnt += left * mul
      cnt += right + 1
    } else if (digit < x) {
      cnt += left * mul
    } else {
      cnt += (left + 1) * mul
    }
    if (x == 0 && mul > 1) {
      cnt -= mul
    }
    right += digit * mul
    mul *= 10
  }
  return cnt
}

// console.log(solve(13))

fireairforce avatar Feb 28 '20 14:02 fireairforce