숫자 n이 있다고 가정하고 모든 숫자가 홀수인 다음으로 가장 가까운 값을 찾아야 합니다. n에 가장 가까운 값으로 묶인 값이 두 개 있는 경우 더 큰 값을 반환합니다.
따라서 입력이 n =243과 같으면 출력은 199가 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- first_even :=-1
- s :=n을 문자열로
- l :=s의 크기
- 0~l 범위의 i에 대해
- s[i]가 짝수이면
- first_even :=나
- 루프에서 나오다
- s[i]가 짝수이면
- first_even이 -1과 같으면
- 반환 n
- big :=1 + s의 숫자 값[인덱스 0에서 i까지]
- s[i]가 "0"과 같으면
- s[i - 1]이 "1"과 같으면
- 작은 :=s[인덱스 0에서 i까지]의 숫자 값 - 1
- 그렇지 않으면
- 작은 :=s[인덱스 0에서 i까지]의 숫자 값 - 11
- s[i - 1]이 "1"과 같으면
- 그렇지 않으면
- 작은 :=s[인덱스 0에서 i까지]의 숫자 값 - 1
- i + 1에서 l 사이의 i에 대해 다음을 수행합니다.
- big :=큰 연결 "1"
- 작은 :=작은 "9" 연결
- 큰 :=큰 숫자 값, 작은 숫자 :=작은 숫자 값
- d2 :=큰 - n, d1 :=n - 작은
- d1
- 작은 반환
- 큰 수익
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
class Solution: def solve(self, n): first_even = -1 s = str(n) l = len(s) for i in range(l): if int(s[i]) % 2 == 0: first_even = i break if first_even == -1: return n big = str(int(s[: i + 1]) + 1) if s[i] == "0": if s[i - 1] == "1": small = str(int(s[: i + 1]) - 1) else: small = str(int(s[i : i + 1]) - 11) else: small = str(int(s[: i + 1]) - 1) for i in range(i + 1, l): big += "1" small += "9" big, small = int(big), int(small) d2 = big - n d1 = n - small if d1 < d2: return small elif d1 >= d2: return big ob = Solution() n = 243 print(ob.solve(n))
입력
243
출력
199