给你一个非负整数 num
,返回它的「加密字符串」。
加密的过程是把一个整数用某个未知函数进行转化,你需要从下表推测出该转化函数:
示例 1:
输入:num = 23
输出:"1000"
示例 2:
输入:num = 107
输出:"101100"
提示:
0 <= num <= 10^9
思路:
观察法总结规律:
1 - 0
3 - 00
7 - 000
15 - 0000
对于一个输入num, 找到小于等于它的 最大的 2 ** n - 1,
如果num == 2 ** n - 1, 则返回 "0" * n,
如果num > 2 ** n - 1, 则返回 (n - (2 ** n - 1))的二进制形式,再在前面补0即可。
时间复杂度:O(logn)
空间复杂度:O(logn)
class Solution(object):
def encode(self, num):
"""
:type num: int
:rtype: str
"""
if not num:
return ""
n = 1
while 2 ** n <= num:
n += 1
n -= 1
s = bin(num - 2 ** n + 1)[2:]
if 2 ** (n + 1) - 1 == num:
return "0" * (n + 1)
l = n - len(s)
return "0" * l + s
第二种思路:
更高级的观察法,f(n) 等于 n + 1的二进制形式去掉最左边的一位。
时间复杂度:O(logN)
空间复杂度:O(logN)
class Solution(object):
def encode(self, num):
"""
:type num: int
:rtype: str
"""
return bin(num + 1)[3:]