이 있는 알고리즘을 찾기 위해 가장 작은 설정의 가장 짧은 prefix 하위 문자열의 지속적인 숫자 시퀀스에 있습니까?
-
29-09-2020 - |
문제
앞에 아무것도 하고 싶을 때 선 감사하는 사람에 의해 삭제를 위해 인내심이 없어요 공식적인 CS 배경 그래서 나는 아마도를 사용하려고 본 약관의 일부 잘못입니다.
나는 퍼즐:주어진 두 번호를 정의하는 설정의 지속적인 계산 숫자의 숫자의 번호,사 약 5 12 긴 숫자(즉,50000 60000,32325600000 및 32399999999),무엇이 가장 빠르고 가장 효율적인 방법으로 응축되면 이를 설정하는 접두사는 포함하는 모든 순열의 이후의 자리?
이 방법을 사용하여 하이브리드의 치료로 이러한 숫자와 문자열.첫 번째 제거하는 모든 쌍의 일치에 0 9 의 끝에 시작/끝입니다.두 번째 만들 전체 시퀀스 복사 두 개의 열을,어디 두 번째 열은 항상 부분과 오른쪽으로 자리를 제거에 상대적으로 열에 있습니다.거기에서 제가 할 수 있습을 재귀적으로 얼마나 많은 시간이 주어진 한 자리-짧은 문자열이 발생 항목 N-계산<10,N-count>=10 을 제거 또 다른 자리에서 모두 열고 반복합니다.
무엇을지 궁금하네요가 있다면 더 빠르고 효율적인 방법입니다.문자열 작업을 대신에의 수학했다는 명백한 빠른 해결지만,일반적인 접근 방식은 여전히 재귀적으로 그룹화하며 자르고 자입니다.내가 만드는 것으로 간주 전체 시리즈의 접두사 및 N-수 열을 다시 가장 높은 숫자 하지만 적어도 본능적으로는 같은 느낌이 든 것보다 효율적 운영을 재귀적으로 감소추장의 숫자가 있습니다.
IE
Input:
Start=50000000
End=55399999
which becomes
Start=500
End=553
Cycle one creates two sequence columns like this:
String Prefix N-Count
500 50 10
501 50 10
etc..
510 51 10
etc..
550 55 6
551 55 6
552 55 6
553 55 6
Cycle two keeps everything where N-count<10 the same, but reduces the rest by 1
digit each and recalculates N-count (while getting rid of duplicates).
String Prefix N-Count
50 5 5
51 5 5
52 5 5
53 5 5
54 5 5
550 55 4
551 55 4
552 55 4
553 55 4
Output: 50,51,52,53,54,55,550,551,552,553
```
해결책
가정 입력 $a,b$, 두 $n$-자리 오래 숫자입니다.우리가 선도하는 제로(는 순간에 볼 why).자 $c$ 가장 긴 공통의 접두사 $a,b$, 자 $a=캘리포니아$, $b=cB$.
는 경우 $=0^{n|c|}$ 고 $B=9^{n|c|}$ 그런 다음 우리는 단순히 출력 $c$ (이 포함되어 있는 경우 $|c|=n$).
그렇지 않으면,우 $d_A$ 첫번째 자리의 $달, 자 $d_B$ 첫번째 자리의 $B$.
재귀적으로 솔루션을 찾을 위한의 범위 $[A,d_A9^{|A|-1}]$ 고 $[d_B0^{|B|-1},B]$, 로,prefix $c$ 습니다.또한,추가 $c(d_A+1),\ldots,c(d_B-1)$.
여기에는 최적화되지 않은 python 구현:
def prefixes(a,b,C=''):
n, m = len(a), max(i for i in range(len(a)+1) if a[:i] == b[:i])
c, A, B = C+a[:m], a[m:], b[m:]
if A == '0'*len(A) and B == '9'*len(B):
yield c
else:
yield from prefixes(A[1:],'9'*(len(A)-1),c+A[0])
for i in range(int(A[0])+1,int(B[0])):
yield f'{c}{i}'
yield from prefixes('0'*(len(B)-1),B[1:],c+B[0])
예를 들어,실행하는 경우 list(prefixes('50000000','55399999'))
다음 당신은 다음과 같이 출력:['50', '51', '52', '53', '54', '550', '551', '552', '553']