Leetcode 972. 相等的有理数
1.题目基本信息
1.1.题目描述
给定两个字符串 s 和 t ,每个字符串代表一个非负有理数,只有当它们表示相同的数字时才返回 true 。字符串中可以使用括号来表示有理数的重复部分。
有理数 最多可以用三个部分来表示:整数部分
-
- 例: 0 ,12 和 123
-
<.> - 例: 0.5 , 1. , 2.12 和 123.0001
-
<.> <(> <)> - 例: 0.1(6) , 1.(9), 123.00(1212)
十进制展开的重复部分通常在一对圆括号内表示。例如:
- 1 / 6 = 0.16666666... = 0.1(6) = 0.1666(6) = 0.166(66)
1.2.题目地址
https://leetcode.cn/problems/equal-rational-numbers/description/
2.解题方法
2.1.解题思路
分数类。对于0.(12)这样的数,等于(12/100+12/10000+12/1000000+...),可以发现是12乘以一个等比数列的和,记r=10*(-k),x=12,则求极限可知原数等于xr/(1-r)(其中k为括号中的数的长度)。然后根据Fraction分数类构建分数,比较大小即可
3.解题代码
python代码
from fractions import Fraction
class Solution:
def isRationalEqual(self, s: str, t: str) -> bool:
# 思路:分数类。对于0.(12)这样的数,等于(12/100+12/10000+12/1000000+...),可以发现是12乘以一个等比数列的和,记r=10**(-k),x=12,则求极限可知原数等于x*r/(1-r)(其中k为括号中的数的长度)。然后根据Fraction分数类构建分数,比较大小即可
def getFraction(s1:str):
n = len(s1)
ans = 0
if "." not in s1:
ans += int(s1)
return ans
else:
i1 = s1.index(".")
ans += int(s1[:i1])
if "(" not in s1:
if n - i1 - 1 > 0:
ans += Fraction(int(s1[i1 + 1:]), 10 ** (n - i1 - 1))
return ans
else:
i2 = s1.index("(")
len1 = i2 - i1 - 1
len2 = n - i2 - 2
if len1 > 0:
ans += Fraction(int(s1[i1 + 1:i2]), 10 ** len1)
ans += Fraction(int(s1[i2 + 1:n - 1]), 10 ** len1 * (10 ** len2 - 1))
return ans
# print(getFraction(s))
# print(getFraction(t))
return getFraction(s) == getFraction(t)
4.执行结果


浙公网安备 33010602011771号