1256. 加密数字
大约 2 分钟
--- 
1256. 加密数字
- 标签:位运算、数学、字符串
- 难度:中等
题目链接
题目大意
描述:给你一个非负整数 ,返回它的「加密字符串」。加密的过程是把一个整数用某个未知函数进行转化,你需要从下表推测出该转化函数:

要求:返回加密字符串。
说明:
- 。
示例:
- 示例 1:
输入:num = 23
输出:"1000"- 示例 2:
输入:num = 107
输出:"101100"解题思路
思路 1:找规律
1. 核心思想
仔细观察题目中给出的映射表,尝试找出 和加密结果之间的关系:
| num | 加密结果 |
|---|---|
| 0 | "" |
| 1 | "0" |
| 2 | "1" |
| 3 | "00" |
| 4 | "01" |
| 5 | "10" |
| 6 | "11" |
| 7 | "000" |
加密结果看起来很像二进制表示,但又不太一样。试着把 的二进制表示列出来:
| num | num+1 | 二进制 | 去掉最高位 1 | 加密结果 |
|---|---|---|---|---|
| 0 | 1 | 1 | (空) | "" |
| 1 | 2 | 10 | 0 | "0" |
| 2 | 3 | 11 | 1 | "1" |
| 3 | 4 | 100 | 00 | "00" |
| 4 | 5 | 101 | 01 | "01" |
| 5 | 6 | 110 | 10 | "10" |
| 6 | 7 | 111 | 11 | "11" |
| 7 | 8 | 1000 | 000 | "000" |
规律一目了然:加密结果 = 的二进制表示去掉最高位的 。
为什么会有这个规律?可以这样理解:把 的二进制表示记为 ,去掉最高位的 后得到 。这个去掉最高位的过程,相当于把 映射到了一个不含前导 的二进制字符串上,而 正好遍历了所有 以内的数。
2. 具体步骤
第 1 步:计算
第 2 步:转为二进制字符串
使用 Python 的 bin() 函数,得到 '0b...' 格式的字符串。
第 3 步:去掉前三位
bin(num + 1)[3:]:
[0:2]是'0b'前缀,去掉。[2]是最高位的 ,去掉。[3:]就是加密结果。
结合示例走一遍:
:,,去掉前三位得到 。
:,,去掉前三位得到 。
:,,去掉前三位得到空字符串 。
思路 1:代码
class Solution:
def encode(self, num: int) -> str:
# num+1 的二进制表示,去掉最高位的 1(以及 '0b' 前缀)
return bin(num + 1)[3:]思路 1:复杂度分析
- 时间复杂度:,二进制转换的时间与 的二进制位数成正比。
- 空间复杂度:,需要存储二进制字符串,长度约为 。