有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数。
来源:互联网 发布:网络测速在线测网速 编辑:程序博客网 时间:2024/04/29 16:13
问题:有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数。
算法问题,我的理解考察用程序解决问题的能力,充分体现一个人从代码层面的生产力,这也是程序员赖以生存的基本技能。
解决问题有思路,但是思路有好坏之分。思维深度和效率是一个矛盾。思维难度越小的算法通常执行效率越差,需要综合平衡。
通常程序实现应非常追求效率。
算法一:从0到n,对其中的每个整数x分别做判断,判断x中含有几个整数1,并返回,外层循环将所有的结果加和即可。
public int countOneNumber(int data) { int totalCount = 0; for (int i= 0; i<= data; i++) { totalCount += oneCount(i); } return totalCount;}private int oneCount (int x) { int count = 0; while(x >0) { int left = x % 10; if(left == 1) { count ++; } x = x/10; } return count;}
这样,这一问题就解决了。算法的复杂度O(n*log10n)
想想有没有更高效的算法。
分析一下,比如446这个数的答案的组成
(1)百位为1
(2)十位为1
(3)各位为1
百位为1,其中包含的数1XX, X每一位可取值0-9, 共10 × 10 = 100 个
十位为1,其中包含的数X1Y,X可取值1,2,3,4,外加一个0, 010 ---> 就是10, 共 5 × 10 = 50个
各位为1,其中包含的数XX1, 前面可取值从 001 ---> 441, 共 55个。
结果:205
有了以上的分析,总结规律。注意条件限制,如果当前位置本来为0,那么这个就不用往上加。
当前位置为1所能组成的数字各位算法为,abc1def = (abc + 1) * 1000, 这个数字左边的所有位组成的数字 + 1, 如果右边有三位数字,则乘以10的三次方。
好了,放程序
public int countOneNumber(int data) { int totalCount = 0; int i = 10; int all = data; while(true) { if(all <= 0) { break; } int left = all % 10; all = all /10; if (left < 1) { totalCount += 0; } else { totalCount += (data / i + 1) * (i / 10); } i = i * 10; } return totalCount;}
算法时间复杂度 O(log10 n)
0 0
- 有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数。
- 有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数
- 对于一个整数n,有一个函数f(n) 可以计算到1到n之间的出现“1“的个数。
- 有一个整数n,写一个函数f(n),返回0~n之间出现的“1”的个数,例如f(1)=1; f(13)=6(1,10,11,12,13一共6个1),最大的f(n)=n的n是多少
- 已知一个整数n,写一个函数f(n),返回0~n间,每个数中出现的“1”的个数,问最大的F(n)= n中n为多少
- 写一个函数,计算0到n之间2的个数 (1-9的个数)
- 写正确函数需要注意的地方:给定一个十进制整数N,计算从1开始到N的所有整数出现的“1”的个数
- 给定一个正整数N,从1到N所有整数,计算出现1的个数
- 写一个函数,计算0到n之间2的个数。
- 写一个函数,计算40亿以内的最大的那个f(n)=n的值,函数f的功能是统计0到n之间所有数字1的数字和
- 给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数
- 给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数。
- 给定一个十进制n,从1开始,到n的所有整数,求出现1的个数
- 求0到n之间出现的"1"的个数
- 求0个数--给定一个整数N,那么N的阶乘N!末尾有多少个0呢?
- 输入一个整数N,求1到N这N个整数中1出现的次数
- Google面试题详解(0~n之间1的个数,f(n)=n)
- 给定一个正整数N计算从1到N中1出现的个数
- Websocket协议
- 排序相关
- dubbo直连提供者
- Oracle DBA 使用 Python
- 使用onclick跳转到其他页面/跳转到指定url
- 有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数。
- 暑期dp46道(5)hdoj 1421 搬寝室s
- 杭电- 1789 Doing Homework again
- 搭建ss服务器及使用kcptun加速
- 1023. 组个最小数 (20)-PAT乙级真题
- 封装
- Leetcode 101. Symmetric Tree (Easy) (cpp)
- textview属性
- HorizontalListView 横向listview