【google面试题】求1到n的正数中1出现的次数的两种思路及其复杂度分析
问题描写叙述:
输入一个整数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出现的次数的两种思路及其复杂度分析的更多相关文章
- The Super Powers UVA 11752 分析分析 求无符号长整形以内的数满足至少可以用两种不同的次方来表示。比如64 = 2^6 = 8^2; 一个数的1次方不算数。
/** 题目:The Super Powers UVA 11752 链接:https://vjudge.net/contest/154246#problem/Y 题意:求无符号长整形以内的数满足至少可 ...
- Google面试题:计算从1到n的正数中1出现的次数
题目: 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次. 找工作,准备看写题目,题目说是Goo ...
- 剑指Offer:面试题32——从1到n整数中1出现的次数(java实现)
问题描述: 输入一个整数n,求1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1的数字有1,10,11,12,1一共出现了5次. 思路:(不考虑时间效率的解法,肯定不 ...
- 面试题32.从1到n整数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从 1到12这些整数中包含1的数字中1,10,11和12,1一共出现了5次 本题可以直接变量1到n的n个数然后分别计 ...
- 求出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 ...
- 【剑指offer】面试题32:从1到n整数中1出现的次数
题目: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.A ...
- 求GCD(最大公约数)的两种方式
求GCD(最大公约数)的两种方式 这篇随笔讲解C++语言程序设计与应用中求GCD(最大公约数,下文使用GCD代替)的两种常用方式:更相减损法和辗转相除法,前提要求是具有小学数学的基本素养,知道GCD是 ...
- 剑指offer-面试题43-1~n整数中1出现的次数-归纳法
/* 题目: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数? 为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没 ...
- 数组中第K小的数字(Google面试题)
http://ac.jobdu.com/problem.php?pid=1534 题目1534:数组中第K小的数字 时间限制:2 秒 内存限制:128 兆 特殊判题:否 提交:1120 解决:208 ...
随机推荐
- [NOIp2014提高组]解方程
思路: 系数的范围有$10^{10000}$,但是用高精度做显然不现实,因此可以考虑一个类似于“哈希”的做法, 对方程两边同时取模,如果取的模数足够多,正确率就很高了. 中间对多项式的计算可以使用$O ...
- java ftp上载下传 遇到的问题
1.下载文件中文乱码,和下载文件大小为0kb /** * Description: 从FTP服务器下载文件 * * @param url * FTP服务器hostname * @param port ...
- 使用 IntraWeb (21) - 基本控件之 TIWTabControl
TIWTabControl 包含的是 TIWTabPage; 设计时通过右键菜单 Add Page 添加(再给页面添加东西时一定要先选定页面); 下面例子是动态添加的. TIWTabControl 所 ...
- 关于 TRegEx.Split()
表达式中的括号将严重影响分割结果. uses RegularExpressions; const FSourceText = '1: AAA 2: BBB 3: CCC'; // 分隔符将有三部分构成 ...
- 给Eclipse安装eUML2插件以及可能出现的依赖错误解决方案(转)
eUML2是一款强大的,基于Eclipse应用程序的UML建模工具.开发者可以在UML开发过程中将模型转化为Java代码:确保软件质量和减少开发时间. 必备条件 Java runtime 1.5 or ...
- 执行nova-manage db sync时出错,提示’Specified key was too long; max key length is 1000 bytes’
执行nova-manage db sync时出错: 2012-03-24 14:07:01 CRITICAL nova [-] (OperationalError) (1071, ‘Specified ...
- 解决ubuntu上在androidstudio中启动emulator闪退的问题(2)
平台 Ubuntu14.04 64 现象 在AndrodStudio中点击模拟器的启动按钮后,模拟器界面弹出后,又立刻闪退. 解决 一.查看模拟器的信息 从上面可以看到模拟器的存放路径以及名称: 路径 ...
- centos下从源码安装openssl 1.0.1g
cd /usr/srcwget https://www.openssl.org/source/openssl-1.0.1g.tar.gz -O openssl-1.0.1g.tar.gz tar -z ...
- 在delphi中嵌入脚本语言--(译)RemObjects Pascal Script使用说明(1)(译)
翻譯這篇文章源於我的一個通用工資計算平台的想法,在工資的計算中,不可避免的需要使用到自定義公式,然而對於自定義公式的實現,我自己想了一些,也在網上搜索了很多,解決辦法大致有以下幾種: 1. 自己寫代碼 ...
- YUI-compressor 在Linux下安装和使用
介绍一个非常流行的javascript压缩工具YUI compressor,可以提供更好的压缩效率:该工具由著名的Yahoo Exceptional Performance项目组出品. JSMin非常 ...