标签:剑指offer for title des 估计 inter ret 根据 span
参考: https://troywu0.gitbooks.io/interview/整数中出现1的次数(从1到n整数中1出现的次数).html
1 public int NumberOf1Between1AndN_Solution(int n) { 2 int count = 0; 3 while (n > 0) { 4 String nStr = String.valueOf(n); 5 for (int i = 0; i < nStr.length(); i++) { 6 if (nStr.charAt(i) == ‘1‘) 7 count++; 8 } 9 n--; 10 } 11 return count; 12 }
这种方法的思路简单,统计每一个数中出现1的次数,能够快速写出代码。但是,这种方法的时间复杂度很高,O(nlog(n)),面试这么写,估计不会留下好的印象。
1 public int NumberOf1Between1AndN_Solution(int n) { 2 int low = 0, cur = 0, high = 0; 3 int count = 0; 4 int factor = 1; 5 while (factor <= n) { 6 high = n / (factor * 10); 7 low = n % factor; 8 // cur = (n - high * (factor * 10) - low) / factor; 9 cur = (n / factor) % 10; 10 if (cur == 0) 11 count += high * factor; 12 else if (cur == 1) 13 count += high * factor + low + 1; 14 else 15 count += (high + 1) * factor; 16 factor *= 10; 17 } 18 return count; 19 }
这一个思路利用了数字的规律和特点,解决问题的效率非常的高,时间复杂度只与数的位数有关。
首先看一个规律:
假设有一个四位数,使用 cur 来表示当前位数对应的数值,high表述cur左边的数,low表示cur右边的数。会有三种情况产生:
根据这一规律,从最低位至最高位,依次求出1出现的次数,最后相加得到最终的结果。
剑指offer:整数中1出现的次数(从1到n整数中1出现的次数)
标签:剑指offer for title des 估计 inter ret 根据 span
原文地址:https://www.cnblogs.com/xiaoyebula/p/12031581.html