(낮음 및 높음) 범위에 존재하는 총 스트로보그램 수를 계산하는 함수를 정의한다고 가정합니다. 스트로보그램식 숫자는 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