问题描写叙述:

输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。比如输入12,从1到12这些整数中包括1 的数字有1。10。11和12。1一共出现了5次。

这是一道广为流传的google面试题。

算法:

第一种思路:对从1到n的每一个数进行统计,统计的结果相加。算法复杂度为O(n)

另外一种思路:举例说明。

令n=321。则:

它的个位上出现1的形式为XY1,次数和为33(由于十位百位上可能出现的组合为0-32)

它的十位上出现1的次数和较为复杂,形式为X1Y,X的取值范围为0-3。Y的取值范围为0-9。所以X1Y一共同拥有40中形式,即1在十位出现次数和为40

它的百位上出现1的形式为1XY显然,XY的取值范围为00-99。所以次数和为100

故总和为100+40+33=173

经过分析,我们能够的到一个一般化的公式:

一个digit位的数n,从右数第i位(i从0開始)上出现1的次数和为:(i+1位到digit-1位的组合数+1)*10的i次方

数学表达为

count(i)=[n/pow(10,i+1)+1]*pow(10,i)

sum=∑count(i)

由于位数digit=[logn]+1   (当中logn为向下取整),所以时间复杂度为O(logn)

代码实现:

第一种思路:

#pragma once
#include<iostream>
using namespace std; int Find(int m)
{
int sum = 0;
while (m > 0)
{
int temp;
temp = m % 10;
if (temp == 1)
sum += 1;
m = m / 10;
}
return sum;
} int Count(int n)
{
int sum = 0;
for (int i = 1; i <= n; i++)
sum += Find(i);
return sum;
} void main()
{
int n;
cin >> n;
Count(n);
cout << Count(n) << endl;
system("pause");
}

另外一种思路:

#pragma once
#include<iostream>
#include"math.h"
using namespace std; int Count(int list[], int n,int digit)
{
int sum = 0;
for (int i = 0; i < digit; i++)
sum += (int(n / pow(10, i + 1)) + 1)*(int)pow(10, i);
return sum;
} void main()
{
int n;
cin >> n;
int temp = n;
int digit = 1;//n的位数
while (temp > 0)
{
if (temp - temp % 10 > 0)
digit++;
temp = temp / 10;
}
int* list = new int[digit];//list[i]中是n从右边第i位上的数字
for (int i = 0; i < digit; i++)
list[i] = (n - int(n%(int)pow(10, i))) / (int)pow(10, i) % 10;
cout << Count(list, n,digit) << endl;
system("pause");
}

【google面试题】求1到n的正数中1出现的次数的两种思路及其复杂度分析的更多相关文章

  1. The Super Powers UVA 11752 分析分析 求无符号长整形以内的数满足至少可以用两种不同的次方来表示。比如64 = 2^6 = 8^2; 一个数的1次方不算数。

    /** 题目:The Super Powers UVA 11752 链接:https://vjudge.net/contest/154246#problem/Y 题意:求无符号长整形以内的数满足至少可 ...

  2. Google面试题:计算从1到n的正数中1出现的次数

    题目: 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次. 找工作,准备看写题目,题目说是Goo ...

  3. 剑指Offer:面试题32——从1到n整数中1出现的次数(java实现)

    问题描述: 输入一个整数n,求1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1的数字有1,10,11,12,1一共出现了5次. 思路:(不考虑时间效率的解法,肯定不 ...

  4. 面试题32.从1到n整数中1出现的次数

    题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从 1到12这些整数中包含1的数字中1,10,11和12,1一共出现了5次 本题可以直接变量1到n的n个数然后分别计 ...

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

    // test20.cpp : 定义控制台应用程序的入口点. // include "stdafx.h" include include include include inclu ...

  6. 【剑指offer】面试题32:从1到n整数中1出现的次数

    题目: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.A ...

  7. 求GCD(最大公约数)的两种方式

    求GCD(最大公约数)的两种方式 这篇随笔讲解C++语言程序设计与应用中求GCD(最大公约数,下文使用GCD代替)的两种常用方式:更相减损法和辗转相除法,前提要求是具有小学数学的基本素养,知道GCD是 ...

  8. 剑指offer-面试题43-1~n整数中1出现的次数-归纳法

    /* 题目: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数? 为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没 ...

  9. 数组中第K小的数字(Google面试题)

    http://ac.jobdu.com/problem.php?pid=1534 题目1534:数组中第K小的数字 时间限制:2 秒 内存限制:128 兆 特殊判题:否 提交:1120 解决:208 ...

随机推荐

  1. NOI.AC NOIP模拟赛 第四场 补记

    NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...

  2. Codeforces 986D Perfect Encoding FFT

    题意: 给定一个数n,选出m个数使得 $\Pi_{i=1}^m a_i\ge n$,求$\sum_{i=1}^m a_i$的最小值 ,其中$m$的大小不限 $n$的长度$\le 10^6$ 简单的计算 ...

  3. HTML5 的新特性以及新标签的浏览器兼容问题

    新特性: HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加. 1)  拖拽释放(Drag and drop) API 2)  语义化更好的内容标签(heade ...

  4. CentOS 7解压安装PHP5.6.13

    自动化脚本: https://github.com/easonjim/centos-shell/blob/master/php/install-php_5.6.13.sh

  5. MikroTik RouterOS安装后初始化配置(PPPOE拨号上网)

    1.修改登入密码 路由器默认登入账号为admin,密码为空,强烈建议修改登入密码保证安全: 2.修改接口名称 选择Interface,切换到Ethernet标签,找到状态是R(run)的两个端口. 给 ...

  6. YAML文件中在单一文件中区分多个文件

    1.在单一文件中,可用连续三个连字号(---)区分多个文件. 2.另外,还有选择性的连续三个点号( ... )用来表示文件结尾. 题外:YAML其实语法很多也很灵活,但是针对Spring支持的语法其实 ...

  7. NXP LPC18xx LPC43xx OTP ID Boot

    static LPC_DEVICE_TYPE LPCtypes[] = { { , , , , , , , , , CHIP_VARIANT_NONE }, /* unknown */ // id, ...

  8. Make the DbContext Ambient with UnitOfWorkScope(now named DbContextScope by mehdime)

    The Entity Framework DbContext (or LINQ-to-SQL DataContext) is a Unit Of Work implementation. That m ...

  9. future封装了callable,thread封装future。

    三.使用Callable,Future返回结果 总结:future封装了callable,thread封装future.将callable的返回结果封装在future中,thread封装future, ...

  10. 【GitLab】gitlab上配置webhook后,点击测试报错:Requests to the local network are not allowed

    gitlab上配置webhook后,点击测试报错: Requests to the local network are not allowed 操作如下: 报错: 错误原因: gitlab 10.6 ...