前言
一直以来都是通过转化为String的方式来获得首位数字, 但是直觉告诉我, 这个肯定不是最高效的。
在stackoverflow上找到了这篇文章。虽然看标题是C#的, 但是算法没有语言之分。同样适用于java
How can you get the first digit in an int (C#)?
解法(效率从低到高)
转化为字符串
1
| int firstDigit = String.valueOf(num).charAt(0) - '0';
|
Result: 9,165,089 ticks
循环除10
1 2 3
| while(num >= 10){ num = 10; }
|
Results: 6,001,570 ticks
暴力if
因为int的取值范围有限, 所以可以使用这种暴力枚举的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| int firstdigit; if (num < 10) firstdigit = num; else if (num < 100) firstdigit = num / 10; else if (num < 1000) firstdigit = num / 100; else if (num < 10000) firstdigit = num / 1000; else if (num < 100000) firstdigit = num / 10000; else if (num < 1000000) firstdigit = num / 100000; else if (num < 10000000) firstdigit = num / 1000000; else if (num < 100000000) firstdigit = num / 10000000; else if (num < 1000000000) firstdigit = num / 100000000; else firstdigit = num / 1000000000;
|
Results: 1,421,659 ticks
二分if
因为int的取值范围有限, 所以可以使用这种暴力枚举的方法。
对上面的暴力枚举使用二分法进行优化。
1 2 3 4
| if (num >= 100000000) num /= 100000000; if (num >= 10000) num /= 10000; if (num >= 100) num /= 100; if (num >= 10) num /= 10;
|
Results: 1,399,788 ticks
参考资料