검지offer 제2판(Python3)-면접문제 39:수조에 나타난 횟수가 절반을 넘는 숫자
제2장 면접에 필요한 기초 지식
제3장 고품질 코드
제4장 면접 문제 해결의 사고방식
면접 문제 27: 두 갈래 나무의 거울
면접 문제 29: 시계 방향 인쇄 매트릭스
면접 문제 30:min 함수를 포함하는 창고
면접 문제 31: 창고의 압입, 팝업 서열
면접 문제
면접 문제 33: 두 갈래 검색 트리의 뒷순서 반복 서열
면접 문제 34: 두 갈래 나무와 어떤 값의 경로
면접 문제
면접 문제 36: 두 갈래 검색 트리와 양방향 체인 테이블
면접 문제 38: 문자열의 배열
제5장 시간과 공간 효율 최적화
제6장 면접에서의 각종 능력
제7장 두 가지 면접 사례
제목 설명
수조 중 한 숫자가 수조의 길이의 절반을 초과하는 횟수가 있으니 이 숫자를 찾아내세요.예를 들어 길이가 9인 그룹 {1,2,3,2,2,5,4,2}를 입력하십시오.숫자 2는 수조에 5차례나 나타나 수조의 길이의 절반을 초과하기 때문에 출력 2.존재하지 않으면 0을 출력합니다.
문제 풀이 사고방식 우객망 방법 1: 미뢰수조 중 한 숫자가 수조의 길이의 절반을 초과하기 때문에 그 숫자가 다른 숫자보다 더 많이 나타난다.그룹을 훑어볼 때 두 개의 값을 저장하는 것을 고려하십시오. 하나는 그룹의 한 숫자이고, 다른 하나는 횟수입니다. 우리가 다음 숫자를 훑어볼 때, 다음 숫자가 우리가 이전에 저장한 숫자와 같다면, 횟수는 1을 더한다.다르면 횟수가 1 줄어든다.횟수가 0이면 다음 숫자를 저장하고 횟수를 1로 설정해야 합니다.이렇게 찾는 숫자는 마지막으로 횟수를 1로 설정할 때 대응하는 숫자일 수도 있고, 이 숫자가 그룹에 있는 수량을 통계해야 확인할 수 있다.실전
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
# write code here
length = len(numbers)
i = 0
counts = 0
while i < length:
if counts == 0:
digit = numbers[i]
i += 1
counts = 1
continue
if numbers[i] != digit:
counts -= 1
else:
counts += 1
i += 1
counts = 0
for num in numbers:
if num == digit:
counts += 1
if counts > length >> 1:
return digit
return 0
방법2: 는 빠른 정렬 계발을 받아 성숙한 수조 중 임의의 k대 숫자를 얻을 수 있는 알고리즘이 있고 시간 복잡도는 O(n)이다.만약 수조에 수량이 수조의 길이의 절반을 초과한다면 정렬된 수조의 중간 위치의 수는 반드시 그 수량이 절반을 초과한 수이기 때문에 이 문제는 정렬된 수조의 중간 위치수를 찾는 것으로 설명할 수 있다.우리는 먼저 무작위로 숫자를 선택한 다음에 수조의 순서를 조정하여 선택한 숫자보다 큰 숫자는 오른쪽에 있고 작은 숫자는 왼쪽에 있다.만약 선택한 수의 색인이 n/2이면 이 수는 중간 위치수입니다.만약 그 인덱스가 n/2보다 크면 중간 위치는 이 수의 왼쪽에 있고 계속 왼쪽 그룹으로 가서 찾습니다.그렇지 않으면 중간 위치가 오른쪽에 있고, 계속 오른쪽 그룹으로 가서 찾아라.이것은 전형적인 귀속 과정이다.실전
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
# write code here
if not numbers:
return numbers
def recc(begin, end):
if begin >= end:
return numbers[begin]
index = begin
for i in range(begin+1, end+1):
if numbers[index] > numbers[i]:
numbers[index], numbers[i] = numbers[i], numbers[index]
index = i
if index == length >> 1:
return numbers[index]
if index > length >> 1:
num = recc(begin, index-1)
else:
num = recc(index+1, end)
return num
length = len(numbers)
number = recc(0, length-1)
counts = 0
for i in range(length):
if number == numbers[i]:
counts += 1
if counts > length >> 1:
return number
return 0
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
검지 offer 제2판(Python3)-면접문제 38: 문자열의 배열면접 문제 27: 두 갈래 나무의 거울 면접 문제 29: 시계 방향 인쇄 매트릭스 면접 문제 30:min 함수를 포함하는 창고 면접 문제 31: 창고의 압입, 팝업 서열 면접 문제 면접 문제 33: 두 갈래 검색 트...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.