3的幂
给定一个整数,写一个函数来判断它是否是 3 的幂次方。
示例 1:
示例 2:
示例 3:
示例 4:
进阶:
你能不使用循环或者递归来完成本题吗?
代码
循环
1 2 3 4 5 6 7 8 9 10
| public boolean isPowerOfThree(int n) { if(n<1)return false; while(n>1){ if(n%3!=0)return false; n/=3; } return true; }
|
进阶
正则匹配
在2的幂中,我们使用了Integer
的BitCount
方法来得到位1的个数来判断,但是这里行不通了,需要考虑新方法,Integer
中有个toString(int i,int radix)
方法,该方法的作用是将int整数转成指定进制数的字符串,这也算是一个方法,但效率不理想
1 2 3 4 5 6 7
| public boolean isPowerOfThree(int n) { if (n < 1) return false; String num = Integer.toString(n, 3); return num.matches("[1][0]*"); }
|
死方法
将int
范围内的所有3的幂写出来,个数当然是有限的。记得之前看到过一句话,不要被算法的外表所迷惑,归根结底,我们要的是性能(就算这种方法很蠢),而不是太多技巧,就算以后升级也是int
之外的其他数据类型的重载。遗憾的是这个方法在性能上并没有优势,总之也算是一个没有使用循环和递归的方法吧。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| public boolean isPowerOfThree(int n) { switch (n){ case 1: return true; case 3: return true; case 9: return true; case 27: return true; case 81: return true; case 243: return true; case 729: return true; case 2187: return true; case 6561: return true; case 19683: return true; case 59049: return true; case 177147: return true; case 531441: return true; case 1594323: return true; case 4782969: return true; case 14348907: return true; case 43046721: return true; case 129140163: return true; case 387420489: return true; case 1162261467: return true; default: return false; } }
|