整数中1出现的次数(从1到n整数中1出现的次数)-剑指Offer

整数中1出现的次数(从1到n整数中1出现的次数)

题目描述

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

思路

  1. 根据数字排列规律,逐个判断每位上的数大于1、等于1和小于1
  2. 除了第1位,其他位置都需要考虑上一位上的数,因为上一位上的数决定这一位上的1有几个循环重复

代码

public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
    	if (n == 0) return 0;
        if (n < 10) return 1;
        char[] data = String.valueOf(n).toCharArray();
        int length = data.length;
        int numPre = data[0] - ‘0‘;
        int sum = 0;
        if (numPre > 1) {
            sum += (Math.pow(10, (length - 1)));
        } else if (numPre == 1) {
            int temp = n % (int)(Math.pow(10, length - 1));
            sum += (temp + 1);
        }
        for (int i = 1; i < length; i++) {
            int num = data[i] - ‘0‘;
            int ten = ((int)Math.pow(10, (length - i - 1)));
            int temp = 0;
            if (num > 1) {
                temp = (n/(ten*10) + 1) * ten;
            } else if (num == 1) {
                temp = n/(ten*10) * ten + (n % ten + 1);
            } else {
                temp = n/(ten*10) * ten;
            }
            sum += temp;
        }
        return sum;
    }
}
时间: 2024-10-11 21:25:06

整数中1出现的次数(从1到n整数中1出现的次数)-剑指Offer的相关文章

【剑指offer】整数中1出现的次数

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27563485 题目描写叙述: 亲们!! 我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他.问题是:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包括1的数字有1.10.11.12.13因此共出现6次,可是对于后面问题他就没辙了.ACMer希望你们帮帮他,并把问题

剑指offer (32) 从1到n整数中1的出现次数

题目:输入一个整数,求从1到n这个n个整数的十进制表示中1的出现次数 方法一:最直观的解法  T(n) = O(nlgn) int NumberOf1Between1AndN_Solution1(unsigned int n) { int number = 0; for(unsigned int i = 1; i <= n; ++ i) number += NumberOf1(i); return number; } int NumberOf1(unsigned int n) { int num

剑指OFFER 整数中1出现的次数

剑指OFFER 整数中1出现的次数 class Solution { public: int hwo_many(int n) { int count=0; while(n!=0) { if(n%10==1)count++; n/=10; } return count; } int NumberOf1Between1AndN_Solution(int n) { int count = 0; for(int i=1;i<=n;i++){ count += hwo_many(i); } return

剑指Offer对答如流系列 - 从1到n整数中1出现的次数

面试题43:从1到n整数中1出现的次数 题目描述 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数. 例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次. 问题分析 最容易想到的思路是通过对10求余数判断整数的个位数字是不是1.代码书写也很简单,但是如果输入的整数n比较大的时候,会有大量的运算. 1是由于数字递增出现的,而十进制影响这种出现的周期性.这本身肯定存在规律,重要的是耐心寻找,不要妄想一次性就找出来,下面的规律要比<剑指Offer>

【剑指offer】数字在排序数组中出现的次数

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27364557 题目描写叙述: 统计一个数字在排序数组中出现的次数. 输入: 每一个測试案例包括两行: 第一行有1个整数n,表示数组的大小.1<=n <= 10^6. 第二行有n个整数,表示数组元素,每一个元素均为int. 第三行有1个整数m,表示接下来有m次查询.1<=m<=10^3. 以下有m行,每行有一个整数k,表示要查询的数. 输出: 相应每一个測试案例,有m行输出,

剑指OFFER之数组中出现次数超过一半的数字(九度OJ1370)

题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 输入: 每个测试案例包括2行: 第一行输入一个整数n(1<=n<=100000),表示数组中元素的个数. 第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,1000000000]. 输出: 对应每个测试案例,输出出现的次数超过数组长度的一半的数,如果没有输出-1. 样例输入:

【剑指offer】Q38:数字在数组中出现的次数

与折半查找是同一个模式,不同的是,在这里不在查找某个确定的值,而是查找确定值所在的上下边界. def getBounder(data, k, start, end, low_bound = False): if end < start : return -1 while start <= end: mid = ( start + end ) >> 1 if data[ mid ] > k: end = mid - 1 elif data[ mid ] < k: star

【剑指offer】Q29:数组中出现次数超过一半的数字

就本题而言,个人觉得练习下partition函数是有必要的,毕竟它是快速排序的核心,是基础性的东西,也是必须要掌握的,至于书中给出的"取巧"性解法,是属于个人思维能力的考察,是一种考虑问题的思路,不是一两个问题就能练就的. partition函数,包括快速排序,是一定要信手拈来的,必须的. import random def MoreThanHalf(array): if len(array) == 0: return 0 start = 0 end = len(array) - 1

【剑指offer】Q32:从1到n整数1出现的次数(python)

def q32(n, len): if n < 0: return 0 elif n <= 1: return n total = 0 while n > 0: if n >= 1 and n < 10: total += 1 return total p1 = n % (10**(len - 1)) h = n / (10**(len - 1)) p2 = p1 + 1 n = p1 if h > 1: total += 10**(len - 1) else: tot

剑指offer (29) 数组中出现次数超过一半或1/3或1/N的数字

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字 方法一:如果把这个数字排序,那么排序之后位于数组中间的数字一定就是出现次数超过数组长度一半的数字 这个数字就是统计学中的中位数,即长度为n的数组中第n/2大的数字 在数组中得到任意第k大数字,这一问题有O(n)解,注:这里第kth个元素,kth从1开始计数,并且重复元素不去重 (1) 直接sort排序,然后定位到索引为kth-1的元素 int FindKth1(std::vector<int>& num, int kt