|
1 | 1 | package com.fishercoder.solutions;
|
2 |
| -/**342. Power of Four |
3 |
| -Given an integer (signed 32 bits), write a function to check whether it is a power of 4. |
4 | 2 |
|
5 |
| -Example: |
6 |
| -Given num = 16, return true. Given num = 5, return false. |
7 |
| -
|
8 |
| -Follow up: Could you solve it without loops/recursion?*/ |
| 3 | +/** |
| 4 | + * 342. Power of Four |
| 5 | + * |
| 6 | + * Given an integer (signed 32 bits), write a function to check whether it is a power of 4. |
| 7 | + * |
| 8 | + * Example: |
| 9 | + * Given num = 16, return true. Given num = 5, return false. |
| 10 | + * Follow up: Could you solve it without loops/recursion? |
| 11 | + * */ |
9 | 12 | public class _342 {
|
10 |
| - //with my original idea in the bottom, just dive a little bit deeper, you can realize that another important feature of a number |
11 |
| - //that is power of four is that its only single one bit must appear on the odd position, and power of two won't meet this requirement |
12 |
| - //decimal number 8 has binary format: 0000-0000-0000-0000-0000-0000-0000-1000 |
13 |
| - //decimal number 16 has binary format: 0000-0000-0000-0000-0000-0000-0001-0000 |
14 |
| - //hex number 0x55555555 has binary format: 1010-1010-1010-1010-1010-1010-1010-1010 |
15 |
| - //thus, doing AND with 0x55555 will check if the only one bit is located on the odd position, thus ruling out those that are power of 2 but not power of 4 |
16 |
| - public boolean isPowerOfFour_bit_manipulation(int num) { |
17 |
| - return (num > 0 && 1073741824 % num == 0 && (num & 0x55555555) != 0); |
| 13 | + public static class Solution1 { |
| 14 | + //Just dive a little bit deeper, you can realize that another important feature of a number |
| 15 | + //that is power of four is that its only single one bit must appear on the odd position, and power of two won't meet this requirement |
| 16 | + //decimal number 8 has binary format: 0000-0000-0000-0000-0000-0000-0000-1000 |
| 17 | + //decimal number 16 has binary format: 0000-0000-0000-0000-0000-0000-0001-0000 |
| 18 | + //hex number 0x55555555 has binary format: 1010-1010-1010-1010-1010-1010-1010-1010 |
| 19 | + //thus, doing AND with 0x55555 will check if the only one bit is located on the odd position, thus ruling out those that are power of 2 but not power of 4 |
| 20 | + public boolean isPowerOfFour(int num) { |
| 21 | + return (num > 0 && 1073741824 % num == 0 && (num & 0x55555555) != 0); |
| 22 | + } |
18 | 23 | }
|
19 | 24 |
|
20 |
| - public boolean isPowerOfFour_base_conversion(int num) { |
21 |
| - //^ means to match the beginning of a line |
22 |
| - //$ means to match the end of a line |
23 |
| - //* means zero or more of the preceding character |
24 |
| - return Integer.toString(num, 4).matches("^10*$"); |
| 25 | + public static class Solution2 { |
| 26 | + public boolean isPowerOfFour(int num) { |
| 27 | + //^ means to match the beginning of a line |
| 28 | + //$ means to match the end of a line |
| 29 | + //* means zero or more of the preceding character |
| 30 | + return Integer.toString(num, 4).matches("^10*$"); |
| 31 | + } |
25 | 32 | }
|
26 | 33 |
|
27 |
| - //a regular loop method to make it AC'ed |
28 |
| - public boolean isPowerOfFour(int num) { |
29 |
| - if (num < 4 && num != 1) { |
30 |
| - return false; |
31 |
| - } |
32 |
| - while (num != 1) { |
33 |
| - if (num % 4 != 0) { |
| 34 | + public static class Solution3 { |
| 35 | + //a regular loop method to make it AC'ed |
| 36 | + public boolean isPowerOfFour(int num) { |
| 37 | + if (num < 4 && num != 1) { |
34 | 38 | return false;
|
35 | 39 | }
|
36 |
| - num /= 4; |
37 |
| - } |
38 |
| - return true; |
39 |
| - } |
40 |
| - |
41 |
| - //simply using the max number possible that is power of 4 won't work for this case, because, that number is a power of 2, but might |
42 |
| - //not be a power of 4, e.g. number 8 |
43 |
| - public boolean isPowerOfFour_not_accepted(int num) { |
44 |
| - return (num > 3 && 1073741824 % num == 0); |
45 |
| - } |
46 |
| - |
47 |
| - public static void main(String... strings) { |
48 |
| - int temp = 4; |
49 |
| - int maxPowerOf4 = 4; |
50 |
| - while (temp > 0) { |
51 |
| - temp *= 4; |
52 |
| - if (temp > 0) { |
53 |
| - maxPowerOf4 = temp; |
| 40 | + while (num != 1) { |
| 41 | + if (num % 4 != 0) { |
| 42 | + return false; |
| 43 | + } |
| 44 | + num /= 4; |
54 | 45 | }
|
| 46 | + return true; |
55 | 47 | }
|
56 |
| - System.out.println("maxPowerOf4 is: " + maxPowerOf4); |
57 |
| - |
58 |
| - |
59 |
| - System.out.println(Integer.parseInt("55555555", 16)); |
60 |
| - System.out.println(Integer.toBinaryString(Integer.parseInt("55555555", 16))); |
61 | 48 | }
|
| 49 | + |
62 | 50 | }
|
0 commit comments