C#算法问题:统计1-20数字位出现次数如何用for循环或更优方法实现
1-20整数数字位出现次数的实现方案
基于整数数组+for循环的实现方法
实现逻辑非常清晰:
- 先初始化一个长度为10的整数计数数组,数组索引对应0-9的数字位,初始值全部为0,专门用来存储每个数字位的出现次数
- 外层for循环遍历1到20的所有整数
- 对每个遍历到的整数,内层用循环逐位拆解数字:每次用
% 10取当前的个位数字,对应计数数组的位置数值+1,再用/ 10去掉已经统计过的个位,直到当前数字变为0即拆解完成 - 最后遍历计数数组的1到9位,按照要求的格式输出结果即可
示例代码(C#为例)
// 初始化计数数组,索引0-9对应数字0-9的出现次数 int[] count = new int[10]; // 遍历1到20的所有整数 for (int num = 1; num <= 20; num++) { int temp = num; // 逐位拆解数字 while (temp > 0) { int digit = temp % 10; count[digit]++; temp = temp / 10; } } // 按要求格式输出 for (int i = 1; i <= 9; i++) { Console.WriteLine($"Number of {i}: {count[i]}"); }
更优方案说明
如果你的需求只是统计1到20的范围,上面的整数数组+for循环的方案已经是最优的,时间复杂度为O(n数字位数),n=20的时候计算量极小,没有额外优化空间。
如果后续需要统计的数字范围很大(比如到10^9级别),遍历每个数字的方案效率会很低,这时候可以用数位动态规划*的方案,直接按位计算每个数字的出现次数,时间复杂度只和数字的位数有关,和范围大小无关,效率会高很多。
内容的提问来源于stack exchange,提问作者Tan
相关产品推荐
相关产品推荐

