> 백엔드 개발 > C++ > 본문

N을 초과하지 않고 S에 어떤 숫자도 포함하지 않는 가장 큰 수

WBOY
풀어 주다: 2023-09-05 17:17:03
앞으로
1249명이 탐색했습니다.

N을 초과하지 않고 S에 어떤 숫자도 포함하지 않는 가장 큰 수

주어진 숫자 N을 초과하지 않고 문자열 S에 어떤 숫자도 포함하지 않는 가장 큰 숫자를 찾는 문제는 문자열 조작 및 숫자 이론과 관련된 문제입니다. N보다 작거나 같고 문자열 S에 있는 모든 숫자도 제외됩니다.

예를 들어 N이 1000이고 S가 "42"인 시나리오를 생각해 보세요. 이 경우 N을 넘지 않고 S에 어떤 숫자도 포함하지 않는 가장 큰 수는 999이다. 999는 문자열 S에서 숫자 4와 2를 제외하고 숫자 0, 1, 3, 5, 6, 7, 8, 9를 사용하여 형성할 수 있는 가장 큰 숫자이기 때문입니다.

이 문제를 해결하기 위해 N까지의 모든 숫자를 반복하고 해당 숫자가 S에 없는지 확인하거나 동적 프로그래밍 또는 역추적과 같은 더 복잡한 방법을 활용하는 등 다양한 접근 방식을 사용할 수 있습니다.

알고리즘

1단계 − main() 함수에서 'N'과 'S'라는 두 개의 문자열 변수를 선언합니다.

2단계 - 이 두 변수를 LargestNumberFinder() 함수에 매개변수로 전달합니다.

3단계 − 비교와 같은 수학 연산을 수행하기 위해 문자열 숫자 N과 S를 암시적으로 정수로 변환합니다.

4단계 - 수동으로 또는 매번 동일한 작업을 수행하는 함수를 생성하여 N에 저장된 숫자에서 선행 0을 제거합니다.

5단계 − 그런 다음 두 문자열의 숫자를 비교하고 문자열 'S'에서 어떤 숫자도 포함하지 않는 'N' 이하로 구성된 가장 큰 숫자가 무엇인지 알아냅니다.

접근 방식 1: - 순진한 접근 방식

다른 문자열의 모든 숫자를 사용하여 주어진 문자열에서 가장 큰 숫자를 찾는 기본 방법은 다음과 같습니다. 기본 함수는 변수를 선언하고 LargestNumberFinder 함수를 호출합니다. 이 함수는 두 개의 문자열을 입력으로 사용하고 문자열 S의 모든 숫자를 포함하는 N보다 작은 모든 값을 확인합니다. 조건이 충족되면 값이 문자열 형식으로 반환됩니다. 출석 함수는 S를 정수 데이터 유형으로 변환하는 동안 'i'에 저장된 값이 문자열 S의 일부인지 확인하는 데 사용됩니다. 입력 문자열은 정수로 변환되고 루프를 사용하여 조건을 평가합니다. 이 코드는 다른 문자열에도 존재하는 특정 문자열의 모든 숫자의 최대값을 출력합니다.

Example

은 다음과 같이 번역됩니다.

Example

이 코드는 문자열 S의 숫자로 구성된 N(입력 문자열을 정수로 변환)보다 작은 가장 큰 숫자를 찾는 솔루션입니다. 이 코드는 'attendance'와 'LargestNumberFinder'라는 두 가지 함수를 활용하여 가장 큰 숫자를 결정하고 반환합니다. 출석 함수는 정수 'i'와 문자열 's'를 입력으로 받아 'i'에 저장된 값이 문자열 's'의 일부인지 확인하고 's'를 정수 데이터 유형으로 변환합니다. LargestNumberFinder 함수는 두 개의 문자열 'x'와 's'를 입력으로 받아 'x'를 정수로 변환한 다음 Attention 함수를 사용하여 N보다 작은 모든 값과 모든 숫자가 's'에 있는지 확인합니다. 주 함수는 변수를 선언하고 가장 큰 숫자를 문자열로 반환하는 LargestNumberFinder 함수를 호출합니다.

으아악

출력

으아악

방법 2: 효율적인 방법

주어진 숫자 문자열 N의 숫자를 주어진 문자열 S의 숫자로 대체하여 가능한 가장 큰 숫자를 얻는 문제 2에 대한 해결책은 효율적인 접근 방식입니다. 이 방법은 먼저 N의 모든 숫자가 S에 있는지 확인하고 S에서 발견된 첫 번째 숫자를 N에 없는 S의 가장 큰 숫자로 바꿉니다. 나머지 숫자는 N이 아닌 S에서 가장 큰 숫자로 대체됩니다. 그런 다음 선행 0이 제거되고 결과는 가능한 가장 큰 숫자로 반환됩니다. 이 방법은 문자열을 정렬할 필요가 없기 때문에 이전 방법보다 더 효율적입니다.

Example

은 다음과 같이 번역됩니다.

Example

이 코드는 가장 큰 숫자를 문자열 "S"에 없는 가장 높은 숫자로 대체하여 주어진 문자열 "N"에서 구성될 수 있는 숫자를 찾는 문제를 해결합니다. LargestNumberFinder 함수는 "num"과 "s"라는 두 개의 문자열 입력을 받아 가능한 가장 큰 숫자를 반환합니다. 벡터 "vis_s"는 문자열 "s"의 값을 저장하는 데 사용됩니다. 그런 다음 해당 숫자를 문자열 "s"에 없는 가장 높은 숫자로 바꿉니다. 그런 다음 코드는 문자열 "s"에 없는 가장 높은 숫자를 찾아 나머지를 바꿉니다. 해당 숫자가 있는 문자열 "num"의 숫자. 마지막 문자열에서 선행 0이 제거되고, 문자열이 비어 있으면 코드는 입력 "N" 및 "를 사용하여 함수를 호출하여 결과를 출력합니다. 으" .

#include <iostream>
#include <string>
#include <vector>

using namespace std;

// function to check for all values of String N with String S and replacing the digit if found same with the largest possible digit not present in S.
string LargestNumberFinder(string num, string s) {
   vector<bool> vis_s(10, false);
   for (int i = 0; i < (int)s.size(); i++) {
      vis_s[int(s[i]) - 48] = true;
   }
   int n = num.size();
   int in = -1;
   for (int i = 0; i < n; i++) {
      if (vis_s[(int)num[i] - '0']) {
         in = i;
         break;
      }
   }
   if (in == -1) {
      return num;
   }
   for (char dig = num[in]; dig >= '0'; dig--) {
      if (vis_s[(int)dig - '0'] == 0) {
         num[in] = dig;
         break;
      }
   }
   char LargestDig = '0';
   for (char dig = '9'; dig >= '0'; dig--) {
      if (vis_s[dig - '0'] == false) {
         LargestDig = dig;
         break;
      }
   }
   for (int i = in + 1; i < n; i++) {
      num[i] = LargestDig;
   }
   int Count = 0;
   for (int i = 0; i < n; i++) {
      if (num[i] == '0')
         Count++;
      else
         break;
   }
   num.erase(0, Count);
   if ((int)num.size() == 0)
      return "0";
   return num;
}
int main() {
   string N = "161516";
   string S = "756";
   cout << LargestNumberFinder(N, S);
   return 0;
}
로그인 후 복사

Output

149999
로그인 후 복사

结论

通过这篇文章,我们更接近理解这些问题背后的原因,并理解了这些概念,这些概念将帮助我们在之前提到的重大实际问题中使用这些基本概念。就像在我们的代码中,我们分别解决每个问题,然后像制作美丽的手工品一样将代码缝合在一起,同样,我们将使用这个概念,尝试逐个解决问题。我们通常会从朴素的方法开始,但通过敏锐的眼光和努力,我们会找到更高效的方法。谁知道在阅读完这篇文章后,你会找到更好、更高效的方法,并进一步简化解决方案。所以,让我们坚持我们的信念和对思维和编码的信任,同时告别。

위 내용은 N을 초과하지 않고 S에 어떤 숫자도 포함하지 않는 가장 큰 수의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:tutorialspoint.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!