Leetcode,在测试用例中有效,但在提交时无效

Leetcode, works in test case but not when submitted

提问人:hiimnewb 提问时间:10/21/2023 最后编辑:hiimnewb 更新时间:10/21/2023 访问量:45

问:

嗨,这是我在 StackOverflow 中的第一个问题,所以它可能并不完美。

我正在尝试使用 python3.10 从 leetcode 中解决这个问题 https://leetcode.com/problems/encode-and-decode-tinyurl/

我的代码在测试用例中工作,但在提交时出现错误。但是,当我将该用例添加到测试用例时,它又起作用了。

正如 leetcode 所建议的那样,我在类中添加了函数,并尽力使编码和解码函数中的变量不可变(例如,每次都创建空列表并将列表转换为字符串对象,以便函数返回字符串对象,而不是列表)__init__

我尽力了,但我找不到解决方案。感谢您的帮助。

import math, random

class Codec:
    def __init__(self):
        self.d = 3
        self.n = 0 

    def isprime(self, n):
        if n < 2:
            return False
        for i in range(2, n//2 + 1):
            if n % i == 0:
                return False
        return True

    def randprime(self, min, max):
        a = random.randint(min, max)
        while self.isprime(a) != True:
            a = random.randint(min, max)
        return a

    def Gete(self, phi_n):
        e = 3
        for i in range(phi_n-1):
            if math.gcd(e, phi_n) == 1:
                return e
            else:
                e += 1

    def Getd(self, e, phi_n):
        d = 3
        while True:
            if (1 - d*e) % phi_n == 0:
                return d
            else:
                d += 1

    def encode(self, shortUrl: str) -> str:
        p = self.randprime(2, 100)
        q = self.randprime(2, 100)
        while p == q:
            p = self.randprime(1000,5000)

        self.n = p*q
        phi_n = (p-1)*(q-1)

        e = self.Gete(phi_n)
        self.d = self.Getd(e, phi_n)

        as_url = []
        encryp_url = []
        as_url = [ord(ch) for ch in shortUrl]
        encryp_url = [pow(ch, e, self.n) for ch in as_url]
        str_encrp_url = "".join(chr(ch) for ch in encryp_url)

        return str_encrp_url
    
    def decode(self, longUrl: str) -> str:
        decryp_url = []
        asc_longUrl = [ord(ch) for ch in longUrl]
        decryp_url = [pow(ch, self.d, self.n) for ch in asc_longUrl]
        message = "".join(chr(ch) for ch in decryp_url)
        return message

---------------添加的信息(错误和测试用例)---------------- 所以当提交代码时,我得到这样的错误。提交时引发的错误

因此,我将其添加到测试用例部分并运行代码,它可以正常工作。同样的情况也适用于测试用例

此外,它在问题中说代码将使用这样的命令运行

"Your Codec object will be instantiated and called as such:
 codec = Codec()
 codec.decode(codec.encode(url))"
python-3.x 不可变性

评论

1赞 jarmod 10/21/2023
一个错误。什么错误?一个测试用例。哪个测试用例?
0赞 Barmar 10/21/2023
似乎每次编码都会更改,从而阻止正确解码。self.dself.n
1赞 Barmar 10/21/2023
如果调用两次,当您尝试解码第一个结果时,它将不起作用,因为 和 不同。encode()self.dself.n
0赞 Community 10/21/2023
请澄清您的具体问题或提供其他详细信息以准确说明您的需求。正如目前所写的那样,很难确切地说出你在问什么。
0赞 hiimnewb 10/21/2023
@Barmar,好吧,我想我明白了。而且我也刚刚意识到,我把 d 作为公钥,把 e 作为私钥,而它恰恰相反。感谢您的帮助

答:

0赞 hiimnewb 10/21/2023 #1

好的,伙计们,谢谢你的帮助。我不知道我做了什么,但它现在起作用了。我做的最后一件事是将 randdom 素数(p 和 q)的范围从 (2~100) 更改为 (100~1000)。然后它奏效了。

我不知道为什么,我认为这是我尝试使用的 RSA 算法的数学。但它现在起作用了。再次感谢 gyus 的帮助。

'''

def encode(self, shortUrl: str) -> str:
    p = self.randprime(100, 1000)
    q = self.randprime(100, 1000)
    while p == q:
        p = self.randprime(100,1000)

    n = p*q
    phi_n = (p-1)*(q-1)
    self.phi_n = phi_n

    self.e = self.Gete(phi_n)

    as_url = []
    encryp_url = []
    as_url = [ord(ch) for ch in shortUrl]
    encryp_url = [pow(ch, self.e, n) for ch in as_url]
    str_encrp_url = "".join(chr(ch) for ch in encryp_url)

    self.n = n

    return str_encrp_url

'''