주어진 방정식에 대한 양의 정수 솔루션 찾기

2811 단어 theabbieleetcodedsa
숨겨진 수식과 값f(x, y)이 있는 호출 가능한 함수z가 주어지면 수식을 리버스 엔지니어링하고 모든 양의 정수 쌍xy을 반환합니다. 여기서 f(x,y) == z는 입니다. 원하는 순서로 쌍을 반환할 수 있습니다.

정확한 공식은 숨겨져 있지만 함수는 단조롭게 증가합니다. 즉:
  • f(x, y) < f(x + 1, y)
  • f(x, y) < f(x, y + 1)

  • 함수 인터페이스는 다음과 같이 정의됩니다.

    인터페이스 CustomFunction {
    공공의:
    //수식을 기반으로 두 양의 정수 x와 y에 대해 양의 정수 f(x, y)를 반환합니다.
    int f(int x, int y);
    };

    귀하의 솔루션을 다음과 같이 판단합니다.
  • 심사위원은 특정 9 에 대한 모든 유효한 쌍의 답변 키를 생성하는 방법과 함께 CustomFunction 의 숨겨진 구현 목록z을 가지고 있습니다.
  • 심사위원은 function_id(코드를 테스트할 구현을 결정하기 위한) 및 대상z의 두 가지 입력을 받습니다.
  • 판사가 귀하의 findSolution에게 전화를 걸어 귀하의 결과를 정답과 비교할 것입니다.
  • 결과가 해답 키와 일치하는 경우 솔루션은 Accepted 입니다.

  • 예 1:

    입력: function_id = 1, z = 5
    출력: [[1,4],[2,3],[3,2],[4,1]]
    설명: function_id = 1에 대한 숨겨진 공식은 f(x, y) = x + y입니다.
    x와 y의 다음 양의 정수 값은 f(x, y)를 5와 같게 만듭니다.
    x=1, y=4 -> f(1, 4) = 1 + 4 = 5.
    x=2, y=3 -> f(2, 3) = 2 + 3 = 5.
    x=3, y=2 -> f(3, 2) = 3 + 2 = 5.
    x=4, y=1 -> f(4, 1) = 4 + 1 = 5.

    예 2:

    입력: function_id = 2, z = 5
    출력: [[1,5],[5,1]]
    설명: function_id = 2에 대한 숨겨진 공식은 f(x, y) = x * y입니다.
    x와 y의 다음 양의 정수 값은 f(x, y)를 5와 같게 만듭니다.
    x=1, y=5 -> f(1, 5) = 1 * 5 = 5.
    x=5, y=1 -> f(5, 1) = 5 * 1 = 5.

    제약:
  • 1 <= function_id <= 9
  • 1 <= z <= 100
  • f(x, y) == z의 해가 1 <= x, y <= 1000 범위에 있음이 보장됩니다.
  • 또한 f(x, y)1 <= x, y <= 1000인 경우 32비트 부호 있는 정수에 맞도록 보장됩니다.

  • 해결책:

    """
       This is the custom function interface.
       You should not implement it, or speculate about its implementation
       class CustomFunction:
           # Returns f(x, y) for any given positive integers x and y.
           # Note that f(x, y) is increasing with respect to both x and y.
           # i.e. f(x, y) < f(x + 1, y), f(x, y) < f(x, y + 1)
           def f(self, x, y):
    
    """
    
    class Solution:
        def findSolution(self, customfunction: 'CustomFunction', z: int) -> List[List[int]]:
            op = []
            for x in range(1, 1001):
                beg = 1
                end = 1000
                while beg <= end:
                    y = (beg + end) // 2
                    val =  customfunction.f(x, y)
                    if val == z:
                        op.append([x, y])
                        break
                    elif beg == end:
                        break
                    elif val > z:
                        end = y
                    else:
                        beg = y + 1
            return op
    

    좋은 웹페이지 즐겨찾기