剑指offer <从1 到 n 整数中1 出现的次数>(8)
2016-05-18 19:52
288 查看
# 面试题:从1 到 n 整数中1 出现的次数
/*题目: 输入一个整数 n,求从1 到 n这n个整数的十进制表示中1 出现的次数。 例如:
输入12,从1 到 12 这些整数中包含 1 的数字有1 ,10, 11 和12, 1一共出现了5次。
*/
# 直接上代码;
@ 首先想到的简单的把每一个数中的 1 的个数找出来,然后累加实现,但是却不是效率高的方法,也不是面试官满
意的答案;
// 低效率版本 时间复杂度为O(nlogn); #include<stdio.h> #include<stdlib.h> int Count_1(int num)//单独处理每一个数,找出其中1 的个数; { int count = 0; while(num) { if((num%10) == 1) count++; num = num/10; } return count; } int SearchCount_1(int num)//计算总共1 出现的次数; { int i = 1; int count = 0; for(; i <= num; i++ ) { count += Count_1(i);//将每个数1出现的次数累加; } return count; } int main() { int num = 22; printf("%d\n",SearchCount_1(num)); system("pause"); return 0; }
@ 然后我们进行优化,
将一个数分为两段,例如 21345; 分为1 ~ 1345, 1346 ~ 21345; 先将最高位的 1 的出现次数计算出来,然后将 后
面四位的以为固定为 1 ,其他三位进行全排列;最后递归的算出 1 ~ 1345 中的1 的个数;
为方便起见,我们将数字转换为字符串进行操作;
# 代码如下
// 高效率版本,时间复杂度 O(logn); #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<string.h> int PowerBase10(unsigned int n) { int result = 1; unsigned int i = 0; for(i = 0; i < n; ++i ) result *= 10; return result; } int NumberOf1(const char *strN) { int first = *strN - '0'; int numFirstDigit = 0; //numFirstDigit 是数字10000 ~ 19999 的第一个位中的数目; int num0therDigits = 0; //num0therDigits 是1346 ~ 21345除了第一位之外的数位中的数目; int numRecursive = 0; //numRecursive 是1 ~ 1345 中的数目; unsigned int length = strlen(strN); if(!strN || *strN < '0' || *strN > '9' || *strN == '\0') return ; if(length == 1 && first == 0) return 0; if(length == 1 && first > 0) return 1; //假设strN 是"21345" if(first > 1) numFirstDigit = PowerBase10(length - 1); else if(first == 1) numFirstDigit = atoi(strN + 1) +1; num0therDigits = first * ( length - 1) * PowerBase10(length - 2); numRecursive = NumberOf1(strN + 1); return numFirstDigit + num0therDigits + numRecursive; } int NumberOfBetween1AndN(int n) { char strN[50]; if(n < 0) return ; sprintf(strN,"%d",n); return NumberOf1(strN); } int main() { printf("%d\n",NumberOfBetween1AndN(21345)); system("pause"); return 0; }
相关文章推荐
- 记一次xtrabackup工具恢复后mysqld_safe启动问题
- jQuery实战学习笔记(二)-用jQuery为页面添加活力
- Tycho基本POM配置
- 剑指offer-第三十五题方法总结
- Node
- Bootstrap:表格和栅格分页
- javascript日期格式化(转字符串)
- javascript数组转换(convert to an Array)
- a:link a:visited a:hover a:active
- node.js 安装和 配置Sublime Text2的Nodejs
- HTML <html> manifest 属性
- beego开发web服务+fiddler模拟Post请求+以json类型发送数据
- Html、Css、Js 编码规范
- HTML <iframe> 标签
- codeforces Money Transfers
- jQuery将form列表转JSON
- DIV+CSS中标签dl dt dd常用的用法
- jquery.validate 扩展验证+异步验证
- 浮动子元素的父元素高度为0,怎么办
- height设置100%的时候,没有生效?