Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 숫자에서 최대 k 개의 인접한 스왑 후 가능한 최소 정수를 찾는 프로그램

<시간/>

매우 큰 정수를 나타내는 num이라는 문자열이 있고 또 다른 값 k가 있다고 가정합니다. 최대 k 번 값의 인접한 두 자리를 바꿀 수 있습니다. 얻을 수 있는 최소값을 찾아야 합니다.

따라서 입력이 num ="5432" k =4와 같으면 첫 번째 숫자가 5432이기 때문에 출력은 2453이 됩니다. 그런 다음 첫 번째 단계 후에는 4532, 4523, 4253, 마지막 단계 2453이 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다.

  • min_num :=num의 자릿수 정렬

  • 나는 :=0, to_find :=0

  • num은 min_num과 같지 않고 k> 0 및 i

    • indx :=num의 인덱스 i에서 찾을 항목의 인덱스

    • indx가 -1과 같지 않은 동안 수행

      • indx - i <=k인 경우

        • num :=num[인덱스 0에서 i-1까지] num을 연결[indx] concatenatenum[인덱스 i에서 indx-1로] num을 연결[인덱스 indx+1에서 끝까지]

        • k :=k -(인덱스 - i)

        • 나는 :=나는 + 1

        • to_find :=0

        • indx :=num의 인덱스 i에서 찾을 항목의 인덱스

      • 그렇지 않으면

        • 루프에서 나오다

    • to_find :=to_find + 1

  • 반환 번호

예시

더 나은 이해를 위해 다음 구현을 살펴보겠습니다.

def solve(num, k):
   min_num = sorted(list(num))
   min_num = ''.join(min_num)
   i = 0
   to_find = 0
   while num != min_num and k > 0 and i < len(num):
      indx = num.find(str(to_find), i)
      while indx != -1:
         if indx - i <= k:
            num = num[:i] + num[indx] + num[i:indx] + num[indx+1:]
            k -= (indx - i)
            i += 1
            to_find = 0
            indx = num.find(str(to_find), i)
         else:
            break
      to_find += 1
   return num

num = "5432"
k = 4
print(solve(num, k))

입력

"5432", 4

출력

2453