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

C++의 스트로보그램매틱 숫자 III


(낮음 및 높음) 범위에 존재하는 총 스트로보그램 수를 계산하는 함수를 정의한다고 가정합니다. 스트로보그램식 숫자는 180도 회전할 때 동일하게 보이는 숫자라는 것을 알고 있습니다.

따라서 입력이 low ="50", high ="100"과 같으면 69, 88, 96의 세 가지 결과가 있으므로 출력은 3이 됩니다.

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

  • findStrogrammatic() 함수를 정의합니다. 이것은 n이 필요합니다.

  • ret 배열 정의

  • n &1이 0이 아닌 경우 -

    • ret 끝에 "0" 삽입

    • ret 끝에 "1" 삽입

    • ret 끝에 "8" 삽입

  • 그렇지 않으면

    • ret의 끝에 빈 문자열 삽입

  • n> 1에 대해 업데이트 n :=n - 2, 수행 -

    • 어레이 온도 정의

    • initialize i :=0의 경우, i

      • s :=ret[i]

      • n> 3이면 -

        • temp의 끝에 "0" + s + "0" 삽입

      • temp의 끝에 "1" + s + "1" 삽입

      • temp의 끝에 "8" + s + "8" 삽입

      • temp의 끝에 "6" + s + "9" 삽입

      • temp의 끝에 "9" + s + "6" 삽입

    • ret :=임시

  • 리턴 렛

  • 기본 방법에서 다음을 수행하십시오 -

  • ret :=0

  • 배열 정의 v

  • for initialize i :=size of low, i <=size of high일 때 업데이트(i 1 증가), -

    • v :=findStrogrammatic(i)

    • j 초기화의 경우:=0, j

      • ret :=ret + (v[j]의 길이> 낮은 길이 AND 높은 길이> v[j]의 길이일 때 1)

  • 리턴 렛

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   vector<string> findStrobogrammatic(int n) {
      vector<string> ret;
      if (n & 1) {
         ret.push_back("0");
         ret.push_back("1");
         ret.push_back("8");
      }
      else {
         ret.push_back("");
      }
      for (; n > 1; n -= 2) {
         vector<string> temp;
         for (int i = 0; i < ret.size(); i++) {
            string s = ret[i];
            if (n > 3) {
               temp.push_back("0" + s + "0");
            }
            temp.push_back("1" + s + "1");
            temp.push_back("8" + s + "8");
            temp.push_back("6" + s + "9");
            temp.push_back("9" + s + "6");
         }
         ret = temp;
      }
      return ret;
   }
   bool compare(string a, string b){
      return a.size() == b.size() ? a >= b : a.size() > b.size();
   }
   int strobogrammaticInRange(string low, string high) {
      int ret = 0;
      vector<string> v;
      for (int i = low.size(); i <= high.size(); i++) {
         v = findStrobogrammatic(i);
         for (int j = 0; j < v.size(); j++) {
            ret += compare(v[j], low) && compare(high, v[j]);
         }
      }
      return ret;
   }
};
main(){
   Solution ob;
   cout <<(ob.strobogrammaticInRange("50", "100"));
}

입력

"50","100"

출력

3