방화벽 규칙
코드 출현 2016 20일차
1 부
나는 아이디어가. 작동하지 않을 수 있습니다.
내 생각은 부분적으로:
입력에서 목록으로 시작:
5-8
0-2
4-7
하한을 기준으로 정수 범위 목록을 오름차순으로 정렬합니다.
0-2
4-7
5-8
고유한 값 세트를 초기화합니다.
{ }
첫 번째 범위의 모든 정수를 더합니다.
{0,1,2}
다음 범위의 하한에 대한 확인을 수행합니다.
Is it two greater than the highest integer in the set?
If so, the integer one higher than the highest integer is the answer
Else, it's either less than, equal to, or one higher than the highest in the set
Add all integers to the set
일치하는 항목이 발견될 때까지 이 작업을 수행합니다. 집합에서 가능한 가장 높은 정수보다 작은 가장 낮은 정수를 가정합니다.
이것이 효과가 있을지 궁금합니다.
나는 그것을 쓰게되어 기쁩니다!
내 아이디어가 작동합니까? 우리는 결코 알지 못할 수도 있습니다.
더 나은 것을 생각했기 때문입니다!
내가 자리를 비운 동안 나는 그 일에 대해 어느 정도 명료성을 얻었다.
그리고 나는 숫자 집합을 전혀 포함하지 않는 훨씬 더 빠른 알고리즘을 생각해 냈습니다!
내 더 나은 아이디어는 다음과 같습니다.
입력에서 목록으로 시작:
5-8
0-2
4-7
하한을 기준으로 정수 범위 목록을 오름차순으로 정렬합니다.
0-2
4-7
5-8
max
를 0
로 설정합니다.max = 0
첫 번째 범위를 기준으로 업데이트
max
:max = Math.max(max, 2)
다음 범위의 하한이
max + 1
미만인 한 계속합니다.루프가 종료될 때까지:
return max + 1
더 빠른 이유:
문제는 실제로 작동할까요?
내 더 나은 아이디어가 작동합니까? 도대체!
더 좋은 점은 종료하기 전에 1005개가 넘는 범위 중 18개만 확인하면 되었다는 것입니다!
2 부
하나부터... 모두까지. 그것이 오는 것을 보았다.
나는 이것이 내 알고리즘에 약간의 조정 만 필요하다고 확신합니다.
do...while
루프를 사용하여 차단되지 않은 IP내 파트 1 알고리즘 업데이트
라운드 1
Set max as 0
Set ips as an empty set
For each range of ips
If the lower bound of the range is greater than the integer one higher than max
For each integer from max + 1 up to but not including the lower bound
Add the integer to ips
Update max to the higher integer between max and the upper bound in the range
Return the count of integers in ips
정답을 생성합니다!
그러나 정답은 차단되지 않은 IP의 수일 뿐이므로 각 IP를 저장할 필요는 없습니다.
나는 집계를 증가시킬 수 있어야합니다!
2라운드
Set max as 0
Set ips as 0
For each range of ips
If the lower bound of the range is greater than the integer one higher than max
Increment ips by the difference of the lower bound and max + 1
Update max to the higher integer between max and the upper bound in the range
Return the count of integers in ips
정답도 생성합니다!
이봐, 잠깐만.
약간의 성능 희생으로 파트 1과 파트 2의 알고리즘을 결합할 수 있었습니다!
reduce()
다시 구조하러!3라운드
For each range of ips, accumulate a 2-element array
Element 1 is ips, an array
Element 2 is max, starting as 0
If the lower bound of the range is greater than the integer one higher than max
For each integer from max + 1 up to but not including the lower bound
Add the integer to ips
Update max to the higher integer between max and the upper bound in the range
Return the first integer in the array, and the length of the array
자바스크립트에서:
let [ips,] = ranges.reduce((acc, range) => {
if (range[0] > acc[1] + 1) {
for (let i = acc[1] + 1; i < range[0]; i++) {
acc[0].push(i)
}
}
acc[1] = Math.max(acc[1], range[1])
return acc
}, [[], 0])
return [ips[0], ips.length]
GIF로:
해냈어!!
이 퍼즐은 내가 초보자에서 전문 컴퓨터 프로그래머가 된 것처럼 느끼게 해주었습니다.
Reference
이 문제에 관하여(방화벽 규칙), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rmion/firewall-rules-3ohb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)