Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 최대 하나의 스왑 작업을 사용하여 가장 작은 수를 구성합니다.

<시간/>

이 문제에서는 양의 정수가 주어집니다. 우리의 임무는 최대 한 번의 스왑 작업을 사용하여 더 작은 수를 형성하는 프로그램을 만드는 것입니다.

기존 번호의 자릿수를 사용하여 새 번호를 생성합니다. 형성된 가장 작은 숫자는 기존 숫자에서 한 자리만 바꿀 수 있습니다.

문제를 이해하기 위해 예를 들어보겠습니다.

Input: n = 63519
Output: 36519

솔루션 접근 방식

문제를 해결하는 한 가지 방법은 주어진 숫자의 자릿수 쌍을 교환하여 생성된 모든 숫자를 찾는 것입니다. 이 교환된 모든 숫자 중에서 가장 작은 숫자가 반환됩니다. 이를 위해 숫자를 문자열로 변환하고 위치를 교환합니다.

예시

솔루션 작동을 설명하는 프로그램

#include <iostream>
using namespace std;

int findSmallestNumSwapDig(int N){

   string strNum = to_string(N);
   string temp = strNum;
   for (int i = 0; i < strNum.size(); i++) {
      for (int j = i + 1; j < strNum.size(); j++) {
         swap(strNum[i], strNum[j]);
         if (stoi(strNum) < stoi(temp))
            temp = strNum;
         swap(strNum[i], strNum[j]);
      }
   }
   return stoi(temp);
}
int main(){
   int num = 792156;
   cout<<"The number is "<<num<<endl;
   cout<<"The smallest number created by swapping one digit is "<<findSmallestNumSwapDig(num) << endl;
   return 0;
}

출력

The number is 792156
The smallest number created by swapping one digit is192756

또 다른 접근 방식

문제를 해결하는 또 다른 방법은 추가 보조 배열 aux[]를 사용하는 것입니다. 이 배열은 현재 인덱스의 오른쪽(큰 인덱스)에 가장 작은 숫자의 인덱스를 저장하는 데 사용됩니다. 즉, aux[i]는 숫자 자릿수의 오른쪽에 있는 가장 작은 숫자의 인덱스입니다. 해당 숫자가 없으면 aux[i] =-1을 초기화합니다. 이제 인덱스 0에서 n-1까지 숫자를 탐색하고 aux[] 배열에서 현재 값보다 작은 숫자를 찾습니다. 인덱스 0 값의 경우 0이 아닌 요소를 확인하고 0이 발생하면 값을 버립니다. 요소가 발견되면 arr[i] 및 arr[aux[i]]를 교환합니다. 생성된 번호를 반환합니다.

예시

솔루션 작동을 설명하는 프로그램

#include <bits/stdc++.h>
using namespace std;

int findSmallestNumSwapDig(int N){

   string num = to_string(N);
   int n = num.size();
   int auxArr[n], right;
   auxArr[n - 1] = -1;
   right = n - 1;
   for (int i = n - 2; i >= 1; i--) {
      if (num[i] >= num[right])
         auxArr[i] = right;
      else {
         if (num[i] == num[i + 1])
            auxArr[i] = right;
         else {
            auxArr[i] = -1;
            right = i;
         }
      }
   }
   int small = -1;
   for (int i = 1; i < n; i++)
   if (num[i] != '0') {
      if (small == -1) {
         if (num[i] < num[0])
            small = i;
      }
      else if (num[i] <= num[small])
            small = i;
   }
   if (small != -1)
      swap(num[0], num[small]);
   else {
      for (int i = 1; i < n; i++) {
         if (auxArr[i] != -1 && num[i] != num[auxArr[i]]) {
            swap(num[i], num[auxArr[i]]);
            break;
         }
      }
   }
   return stoi(num);
}
int main(){
   int num = 792156;
   cout<<"The number is "<<num<<endl;
   cout<<"The smallest number created by swapping one digit is" <<findSmallestNumSwapDig(num)<< endl;
      return 0;
}

출력

The number is 792156
The smallest number created by swapping one digit is192756