《剑指offer》——整数中1出现的次数(从1到n整数中1出现的次数)
来源:互联网 发布:python twisted 安装 编辑:程序博客网 时间:2024/04/27 18:17
T:
题目描述
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
两种解决方式:找规律和暴力遍历
- 暴力遍历
化为字符串,或者用10取余,都是一样的道理:
code:
/** * 通过统计字符串的方式,计算其包含有多少个1 * @param n * @return */public int test(int n) { int count = 0; for (int i = 0; i <= n; i++) { String ss = String.valueOf(i); for (int j = 0; j < ss.length(); j++) { if (ss.charAt(j) == '1') { count ++; } } } return count;}
- 找规律
这个规律还真的不好找,我用了好几张稿纸,才算弄出来。。。
具体的细节或者规律的推导过程这里不讲了,就贴我在讨论班上的留言吧:
code:
/** * T: 整数中1出现的次数(从1到n整数中1出现的次数) * * 题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数? * 为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次, * 但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化, * 可以很快的求出任意非负整数区间中1出现的次数。 * * date: 2015.11.19 19:22 * @author SSS * */public class Solution { /** * 通过找规律求解 * 这个规律真心不好找。。。 * @param n * @return */ public int NumberOf1Between1AndN_Solution(int n) { int count = 0; if (n == 0) { return count; } // 该数的长度 int size = 0; int tempN = n; while ((int)(tempN / Math.pow(10, size)) != 0) { size ++; } // 标准值,即9,99,999,9999,……中含有多少个1 int []F = new int[size + 1]; // 下标为0的地方空出来 F[0] = 0; // 基本用不着 F[1] = 1; for (int i = 2; i < F.length; i++) { F[i] = (int) (10 * F[i - 1] + Math.pow(10, i - 1)); } int []arr = new int[size + 1]; tempN = n; int tempK = 0; // 数字倒着放在数组中,便于计算 while (tempK < size) { arr[size - tempK] = (int) (tempN / Math.pow(10, size - tempK - 1)); tempN = (int) (tempN % Math.pow(10, size - tempK - 1)); tempK ++; } int []f = new int[size + 1]; // 先确定起点 if (arr[1] > 0) { f[1] = 1; } else { f[1] = 0; } for (int i = 2; i < f.length; i++) { f[i] = arr[i] * F[i - 1] + f[i - 1]; int tail; int tailNum = (int) (n % Math.pow(10, i - 1)); if (arr[i] == 0) { tail = 0; } else if (arr[i] == 1) { tail = tailNum + 1; } else { tail = (int) Math.pow(10, i - 1); } f[i] += tail; } count = f[size]; return count; }}
0 0
- 《剑指offer》整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer--整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指Offer--032-整数中1出现的次数(从1到n整数中1出现的次数)
- [剑指offer]整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer-整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指Offer:整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer:整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer----整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer-整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer 整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer-31.整数中1出现的次数(从1到n整数中1出现的次数)
- 【剑指offer】整数中1出现的次数(从1到n整数中1出现的次数)
- 《剑指offer》整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer:整数中1出现的次数(从1到n整数中1出现的次数)
- 整数中1出现的次数,即从1到n整数中1出现的次数(剑指Offer)
- 剑指Offer——(31)整数中1出现的次数(从1到n整数中1出现的次数)
- 《剑指offer》——整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer——整数中1出现的次数(从1到n整数中1出现的次数)
- mysql日常操作命令
- APP兼容测试点
- while循环下switch.....case的应用
- intellij idea 15.01 java: constant string too long
- ios开发大连讯飞语音sdk
- 《剑指offer》——整数中1出现的次数(从1到n整数中1出现的次数)
- 内存泄露从入门到精通三部曲之常见原因与用户实践
- AsyncTask 异步任务
- HDOJ 2049 不容易系列之(4)——考新郎【错排 组合数】
- deep learning 学习笔记
- SSH三大框架整合步骤
- Android连接服务器的封装类
- 如何在Mac OS X上安装 Ruby运行环境
- 进程线程及堆栈关系的总结 http://blog.csdn.net/echoisland/article/details/6403763