如何从x、y生成的唯一ID反向推导x与y的值?
从生成ID反推原始x和y的方法
首先明确ID的生成逻辑:将整数x、x+y、y分别转为字符串后拼接,再转回整数得到ID,即:
id = parseInt(String(x) + String(x+y) + String(y))
反推的核心是把ID转为字符串后,尝试所有合理的拆分方式,找到满足parseInt(s1) + parseInt(s3) = parseInt(s2)的三个子串s1(对应x)、s2(对应x+y)、s3(对应y)。
具体步骤
转换ID为字符串
将目标ID转为字符串形式id_str,比如ID为12153时,id_str = "12153"。枚举所有拆分组合
设s1长度为a,s3长度为b,则s2的长度为len(id_str) - a - b。其中:a的取值范围是1 ≤ a ≤ len(id_str)-2(s2和s3至少各占1位)b的取值范围是1 ≤ b ≤ len(id_str)-a-1(s2至少占1位)
对每一组
(a,b),拆分出:s1 = id_str.slice(0, a)s2 = id_str.slice(a, len(id_str)-b)s3 = id_str.slice(len(id_str)-b)
验证拆分合法性
对每组拆分的子串,需同时满足两个条件:- 无无效前导零:子串长度大于1时,不能以
"0"开头(除非子串本身就是"0",对应x或y为0的情况) - 数值匹配:
parseInt(s1) + parseInt(s3) === parseInt(s2),这是核心验证条件,确保x+y的数值等于x与y的和。
- 无无效前导零:子串长度大于1时,不能以
输出有效结果
所有通过验证的(parseInt(s1), parseInt(s3))就是原始的x和y组合。若没有符合条件的拆分,说明该ID并非用给定规则生成。
示例演示
假设ID为12153(由x=12、y=3生成,x+y=15):
- 尝试
a=2、b=1:
s1="12",s2="15",s3="3"。验证12+3=15,完全匹配,得到x=12、y=3。
再比如ID为055(由x=0、y=5生成,x+y=5):
- 尝试
a=1、b=1:
s1="0",s2="5",s3="5"。验证0+5=5,符合条件,得到x=0、y=5。
注意事项
- 理论上可能存在多组(x,y)生成同一ID的极端情况,需输出所有符合条件的组合。
- 处理x或y为0的场景时,要允许子串为
"0",但禁止长度大于1的子串以"0"开头(比如"012"是无效的,因为整数不会以0开头)。
内容的提问来源于stack exchange,提问作者CoreNoob
相关产品推荐
相关产品推荐

