【剑指offer】-1~n整数中1出现的次数-31/67

简介: 【剑指offer】-1~n整数中1出现的次数-31/67

1. 题目描述

求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下113中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。

2. 题目分析

  1. 最常见做法和想到的就是从1~n依次遍历,然后遍历每一个数字的每一位数,判断其是不是等于1,累加return
  2. 这是介绍一种新的解法,类似找规律的样子

3. 题目代码

public static int NumberOf1Between1AndN_Solution(int n) {
    int sum = 0;
    int hight = n / 10;
    int low = 0;
    int cur = n % 10;
    int dight = 1;
    // 4356
    while (hight != 0 || cur != 0) {
      if (cur == 0) {
        sum += dight * hight;
      } else if (cur == 1) {
        sum += dight * hight + low + 1;
      } else if (cur >= 2) {
        sum = sum + dight * (hight + 1);
      }
      low = low + cur * dight;
      cur = hight % 10; // 5
      dight = dight * 10; // 10
      hight = hight / 10; // 43
    }
    return sum;
  }


相关文章
|
7月前
|
C++ Java Go
C/C++每日一练(20230409) 岛屿数量、出现次数最多整数、两数相除
C/C++每日一练(20230409) 岛屿数量、出现次数最多整数、两数相除
54 0
C/C++每日一练(20230409) 岛屿数量、出现次数最多整数、两数相除
|
7月前
|
算法 Java
每日一题《剑指offer》数组篇之数组中出现次数超过一半的数字
每日一题《剑指offer》数组篇之数组中出现次数超过一半的数字
74 0
每日一题《剑指offer》数组篇之数组中出现次数超过一半的数字
|
7月前
|
算法 Java
每日一题《剑指offer》数组篇之统计数字在排序数组中出现的次数
每日一题《剑指offer》数组篇之统计数字在排序数组中出现的次数
52 0
每日一题《剑指offer》数组篇之统计数字在排序数组中出现的次数
【剑指offer】-数字在排序数组中出现的次数-32/67
【剑指offer】-数字在排序数组中出现的次数-32/67
剑指offer 44. 从1到n整数中1出现的次数
剑指offer 44. 从1到n整数中1出现的次数
74 0
|
C++
剑指offer 55. 数字在排序数组中出现的次数
剑指offer 55. 数字在排序数组中出现的次数
86 0
|
算法 C语言
剑指Offer 第53题:数字在升序数组中出现的次数
剑指Offer 第53题:数字在升序数组中出现的次数
143 0
剑指Offer 第53题:数字在升序数组中出现的次数
每日一题——最少移动次数使数组元素相等 II
每日一题——最少移动次数使数组元素相等 II
90 0
每日一题——最少移动次数使数组元素相等 II
面试官:判断一个数是否为2的整数次幂
面试官:判断一个数是否为2的整数次幂
|
算法 PHP
剑指Offer算法题解:56 - II. 数组中数字出现的次数 II
剑指Offer算法题解:56 - II. 数组中数字出现的次数 II
77 0