/*标记1-N中1出现的次数。例如,当N等于18时,1出现的次数为2 + 9 = 11
个位数出现1的为:1,11,十位数出现1的为10-18*/
public class OneNoInN {
// 暴力解法
public static int solution1(int num) {
// 异常处理
if (num < 1)
return 0;
// 标记变量count
int count = 0;
// 计算没个数中的1的个数,然后加起来,时间复杂度为O(nlogn)
for (int i = 1; i < num + 1; i++) {
count += get1Num(i);
}
return count;
}
public static int get1Num(int num) {
int res = 0;
while (num != 0) {
if (num % 10 == 1) {
res++;
}
num /= 10;
}
return res;
}

// 第二种方法,进行分析
// 两种情况:
// 第一种情况:最高位为1,1-114,首先划分为1-14和15-114,
// 百位为1,则相应的对应的1的个数为num % tmp1 + 1.即114 % 100 + 1 = 15
// 十位为1时,有 15 - 19 还有110 - 114;
// 个位为1时,有21-91,101,111,
// 则对应的1的个数为1 * (3 - 1) * (100 / 10)
// 第二种情况: 最高位大于1,则最高位的情况为tmp1,其他低位的情况类似
public static int solution2(int num) {
// 异常处理
if (num < 1)
return 0;
// 得出当前字符的长度
int len = getLenOfNum(num);
// 进行判断,如果当前字符长度为1,则返回1
if (len == 1)
return 1;
// 记录当前最大值一个量级的一个数
int tmp = powBase10(len - 1);
// 得到最高位的值
int first = num / tmp;
int firstOneNum = first == 1 ? num % tmp + 1 : tmp;
int otherOneNum = first * (len - 1) * (tmp / 10);
return firstOneNum + otherOneNum + solution1(num % tmp);
}

// 得出当前数值的位数
public static int getLenOfNum(int num) {
int len = 0;
while (num != 0) {
len++;
num /= 10;
}
return len;
}

// 求一个指数的值
public static int powBase10(int base) {
return (int) Math.pow(10, base);
}
public static void main(String[] args) {
// TODO Auto-generated method stub

}

}

1-N中1出现的次数的更多相关文章

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

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

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

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

  3. 题目1373:整数中1出现的次数(从1到n整数中1出现的次数)

    题目1373:整数中1出现的次数(从1到n整数中1出现的次数) 题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他 ...

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

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

  5. 【编程题目】在从 1 到 n 的正数中 1 出现的次数

    30.在从 1 到 n 的正数中 1 出现的次数(数组)题目:输入一个整数 n,求从 1 到 n 这 n 个整数的十进制表示中 1 出现的次数.例如输入 12,从 1 到 12 这些整数中包含 1 的 ...

  6. 25.在从1到n的正数中1出现的次数[NumberOf1Between1_N]

    [题目] 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次. [分析] 这是一道广为流传的goo ...

  7. 剑指offer系列57---整数中1出现的次数

    [题目]求出1~n的整数中1出现的次数.(10进制) package com.exe11.offer; /** * [题目]求出1~n的整数中1出现的次数. * @author WGS * */ pu ...

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

    题目: 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,一共出现了5次. 思路: 1.累加法 累加1到n中每个整数 ...

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

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

  10. 1049. Counting Ones/整数中1出现的次数(从1到n整数中1出现的次数)

    The task is simple: given any positive integer N, you are supposed to count the total number of 1's ...

随机推荐

  1. git 提示 Please move or remove them before you can merge 解决办法

    解决Git冲突造成的Please move or remove them before you can merge git clean -d -fx其中x -----删除忽略文件已经对git来说不识别 ...

  2. elasticsearch SpanNearQuery inOrder参数

    一直没有注意还有一个inOrder参数: public SpanNearQuery(SpanQuery[] clauses, int slop, boolean inOrder) When inOrd ...

  3. JAVA 批量执行测试用例

    如果多个测试用例在不同的类中,又需要一次性执行完所有的测试用例,则可以使用到Junit中的批量执行测试方法. 方法一 这种方式非常简单,不需要额外多写一行代码,Eclipse 本来就支持以项目或包为单 ...

  4. docker从零开始(三)服务初体验docker compose

    决条件 安装Docker 1.13或更高版本. 获取Docker Compose.在适用于Mac的Docker和适用于Windows的Docker上,它已预先安装,因此您可以随意使用.在Linux系统 ...

  5. 第三篇:使用firewall-cmd

    本文来源:Working with firewalld         其它参考文档:redhat官方中文文档 1.查询类命令 2.设置类命令 3.运行时zone设置 4.永久性zone设置 5.直接 ...

  6. jenkins,已令人发指的简发到如此地步了?

    不用tomcat,一条命令.... java -jar jenkins.war

  7. 发布Office 365插件

    在上一篇博客<VisualStudio 2013开发Office插件>开发完成了插件后,需要将插件发布 发布前需要: Azure 应用服务,作为Office插件的发布空间,地址是:http ...

  8. UVA 11624 Fire!【两点BFS】

    Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of the m ...

  9. kattis Curious Cupid (莫队算法)

    Curious Cupid There are K different languages in the world. Each person speaks one and only one lang ...

  10. Educational Codeforces Round 10 E - Pursuit For Artifacts (强联通缩点 + 回溯)

    题目链接:http://codeforces.com/contest/652/problem/E 给你n个点m个边,x和y双向连接,要是z是1表示这条边上有宝藏,0则没有,最后给你起点和终点,问你要是 ...