2021-03-20 00:26:51 +01:00
|
|
|
# Power of 2
|
2021-03-18 21:50:30 +01:00
|
|
|
#
|
|
|
|
# Given an integer n, return true if it is a power of two. Otherwise, return false.
|
|
|
|
#
|
|
|
|
# An integer n is a power of two, if there exists an integer x such that n == 2^x.
|
|
|
|
#
|
|
|
|
# Example 1:
|
|
|
|
# Input: n = 1
|
|
|
|
# Output: true
|
|
|
|
# Explanation: 2^0 = 1
|
|
|
|
#
|
|
|
|
# Example 2:
|
|
|
|
# Input: n = 16
|
|
|
|
# Output: true
|
|
|
|
# Explanation: 2^4 = 16
|
|
|
|
#
|
|
|
|
# Example 3:
|
|
|
|
# Input: n = 3
|
|
|
|
# Output: false
|
|
|
|
#
|
|
|
|
# Example 4:
|
|
|
|
# Input: n = 4
|
|
|
|
# Output: true
|
|
|
|
#
|
|
|
|
# Example 5:
|
|
|
|
# Input: n = 5
|
|
|
|
# Output: false
|
|
|
|
#
|
|
|
|
# Constraints: -231 <= n <= 231 - 1
|
|
|
|
# @param {Integer} n
|
|
|
|
# @return {Boolean}
|
|
|
|
#
|
2021-03-20 00:19:45 +01:00
|
|
|
|
2021-03-18 21:50:30 +01:00
|
|
|
# Approach 1: Recursion
|
|
|
|
#
|
2021-03-20 04:56:58 +01:00
|
|
|
# Time Complexity: O(logn)
|
2021-03-18 21:50:30 +01:00
|
|
|
#
|
|
|
|
def is_power_of_two(n)
|
|
|
|
if n == 1
|
2021-03-20 04:56:58 +01:00
|
|
|
true
|
2021-09-03 22:24:58 +02:00
|
|
|
elsif n.even?
|
2021-03-20 04:56:58 +01:00
|
|
|
is_power_of_two(n / 2)
|
2021-03-18 21:50:30 +01:00
|
|
|
else
|
2021-03-20 04:56:58 +01:00
|
|
|
false
|
2021-03-18 21:50:30 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
n = 1
|
|
|
|
# Output: true
|
|
|
|
puts is_power_of_two(n)
|
|
|
|
n = 16
|
|
|
|
# Output: true
|
|
|
|
puts is_power_of_two(n)
|
|
|
|
n = 3
|
|
|
|
# Output: false
|
|
|
|
puts is_power_of_two(n)
|
|
|
|
n = 4
|
|
|
|
# Output: true
|
|
|
|
puts is_power_of_two(n)
|
|
|
|
n = 5
|
|
|
|
# Output: false
|
2021-03-20 00:19:45 +01:00
|
|
|
puts is_power_of_two(n)
|
|
|
|
|
|
|
|
#
|
|
|
|
# Approach 2: Without recursion
|
|
|
|
#
|
|
|
|
# Time Complexity: O(n)
|
|
|
|
#
|
|
|
|
def is_power_of_two(n)
|
2021-09-03 22:24:58 +02:00
|
|
|
n /= 2 while n.even? && n != 0
|
2021-03-20 00:19:45 +01:00
|
|
|
n == 1
|
|
|
|
end
|
|
|
|
|
|
|
|
n = 1
|
|
|
|
# Output: true
|
|
|
|
puts is_power_of_two(n)
|
|
|
|
n = 16
|
|
|
|
# Output: true
|
|
|
|
puts is_power_of_two(n)
|
|
|
|
n = 3
|
|
|
|
# Output: false
|
|
|
|
puts is_power_of_two(n)
|
|
|
|
n = 4
|
|
|
|
# Output: true
|
|
|
|
puts is_power_of_two(n)
|
|
|
|
n = 5
|
|
|
|
# Output: false
|
|
|
|
puts is_power_of_two(n)
|
2021-03-20 00:20:00 +01:00
|
|
|
|
|
|
|
#
|
|
|
|
# Approach 3: Using Math library
|
|
|
|
#
|
|
|
|
# Time Complexity: O(1)
|
|
|
|
#
|
|
|
|
def is_power_of_two(n)
|
|
|
|
result_exponent = Math.log(n) / Math.log(2)
|
|
|
|
result_exponent % 1 == 0
|
|
|
|
end
|
|
|
|
|
|
|
|
n = 1
|
|
|
|
# Output: true
|
|
|
|
puts is_power_of_two(n)
|
|
|
|
n = 16
|
|
|
|
# Output: true
|
|
|
|
puts is_power_of_two(n)
|
|
|
|
n = 3
|
|
|
|
# Output: false
|
|
|
|
puts is_power_of_two(n)
|
|
|
|
n = 4
|
|
|
|
# Output: true
|
|
|
|
puts is_power_of_two(n)
|
|
|
|
n = 5
|
|
|
|
# Output: false
|
2021-03-20 04:56:58 +01:00
|
|
|
puts is_power_of_two(n)
|