统计字数问题
来源:互联网 发布:浙江出版联合集团知乎 编辑:程序博客网 时间:2024/04/29 08:16
文章内就不再贴题目了,有需要大家可以直接去OJ上查看—统计字数问题。
1. 算法描述
本题目采用了排列组合的思想。分别计算每个数字在每一位上出现的次数,累加之后,即为最后的结果。 需要特别注意的是,我们直接用排列组合直接计算,但是并没有把0 和其他数字分开来算, 所以这样计算出来的结果就是把前导0 也一起算进去了,所以输出结果前应该减掉所有前导0。 文字说明不够直观,下面我举个栗子来帮助大家理解这个算法
栗子
page:25634
位次该位上数字 0-9 共同出现的次数小于该位上数字的数额外加的值等于该位上的数字的数额外加的值 个位42563 * 1+1+1 十位3256 * 10+10+4 百位625 * 100+100+34 千位52 * 1000+1000+634 万位20 * 10000+10000+5634相信大家可以从表格中找到规律,想要动手实现了吧!但是别着急,现在还没有减去前导0 ,减完以后才能得到正确结果.
下面是前导0 出现次数的规律
仍以 25634为例 范围前导0个数 10000+0 01000 ~ 099999000 * 1 00100 ~ 00999900 * 2 00010 ~ 0009990 * 3 00001 ~ 000099 * 4 000001 * 5
相信规律并不难找到,就不再啰嗦了。
2. 代码实现
import java.io.IOException;import java.util.Scanner;/** * Created by chen_swe on 3/12/16. */public class Main { /** * 计算并累加第[lg(base) - 1] 位(从右向左)各个数字出现的次数 * * @param page 总页数 * @param base 基数,用来确定当前计算的是哪一位。 * @param num 整形数组,用来存放各个数字出现的次数。 */ public static void handle(final int page, int base, int[] num) { int s = page / (base * 10); int l = page % (base * 10); int special = l / base; l %= base; for (int i = 0; i < 10; ++i) { num[i] += s * base; if (i < special) num[i] += base; if (i == special) num[i] += l + 1; } } /** * 减去前导0的个数 * * @param page 总页数 * @param num 整形数组,用来存放各个数字出现的次数。 */ public static void DealWithZero(int page, int[] num) { int len = String.valueOf(page).length(); int tmp = 9 * (int) Math.pow(10, len - 2); int number = 1; while (tmp != 0) { num[0] -= tmp * number; tmp /= 10; ++number; } num[0] -= len; } public static void main(String[] args) throws IOException { Scanner cin =new Scanner(System.in); final int Page = cin.nextInt(); int[] num = new int[10]; int base = 1; while (true) { handle(Page, base, num); base *= 10; if (Page / base == 0) break; } DealWithZero(Page, num); for (int i : num) System.out.println(i); }}
3. 算法分析
时间复杂度 lg(n)
0 0
- 统计字数问题
- 统计字数问题
- pdf文档统计字数的问题
- 新浪微博长链接字数统计问题
- 字数统计
- 字数统计
- 字数统计
- VBA 字数统计
- 字数统计-简单哈希表
- 统计文本字数
- 统计页面字数
- JS统计字数
- TextArea统计字数
- 字数统计器
- 微博 字数统计功能
- JavaScript 统计中文字数
- Fckeditor 字数统计
- textarea 字数统计
- 设置程序运行期间使用dll的路径
- 3、目录操作
- Android IPC进程通信之Messager方式
- iOS OC语言: Block底层实现原理
- Ubuntu下 搭建Android5.1.1编译环境
- 统计字数问题
- 关于CSS浮动float属性的了解及清除浮动的方式
- 设计模式的学习
- Java中的访问权限控制
- 深入理解 STL
- 企业级账号$299——用in house证书打ipa包(以无线 + 无需udid方式安装企业内部应用)
- SVD(二)
- c标签下拉选择回显
- 位操作符