2017-10-29 10 views
1

저는 인터뷰 질문을 준비하는 초보자입니다. 최근에 문자열을 반복하는 것에 대한 질문이 있습니다.이동 포인터 VS. 그냥 문자열을 반복합니다

"Valid Palindrome"과 같은 질문을 처리 할 때 일반적으로 두 가지 방법으로 문제를 해결할 수 있습니다.

우리가 목표 문자 찾을 때까지 우리는 하나가 포인터를 계속 업데이트 :

s = s.toLowerCase(); 
int lo = 0; 
int hi = s.length() - 1; 
while(hi > lo){ 
    while(lo < hi && !Character.isLetterOrDigit(s.charAt(lo))) lo ++; 
    while(hi > lo && !Character.isLetterOrDigit(s.charAt(hi))) hi --; 

    if(s.charAt(lo) != s.charAt(hi)) return false; 

    lo ++; 
    hi --; 
} 

return true; 

하거나 (leetcode 토론에서) 문자열의 반복 :

int head = 0, tail = s.length() - 1; 
char cHead, cTail; 
while(head <= tail) { 
    cHead = s.charAt(head); 
    cTail = s.charAt(tail); 
    if (!Character.isLetterOrDigit(cHead)) { 
     head++; 
    } else if(!Character.isLetterOrDigit(cTail)) { 
     tail--; 
    } else { 
     if (Character.toLowerCase(cHead) != Character.toLowerCase(cTail)) { 
      return false; 
     } 
     head++; 
     tail--; 
    } 
} 

return true; 

을 내가 더 나은 어떤 방법을 모르겠습니다을 큰 O 분석의 용어와 인터뷰 중에 사용할 분석법은 무엇입니까?

미리 감사드립니다.

+0

"big-O analysis"는 "얼마나 효율적입니까?"와 동의어로 사용하지 마십시오. 두 알고리즘 모두 문자열의 길이에 비례하므로 'O (n)'입니다. 하나의 알고리즘은 각 루프 반복에서 더 빠르거나 고정 오버 헤드가 크거나 작을 수 있지만 이러한 차이는 big-O 분석의 일부가 아닙니다. – ajb

+0

고마워, 나는 그걸 명심 할거야. 메소드에 계단식 루프가 있어도 첫 번째 메소드의 시간 복잡도가 여전히 O (n)인지 확인하고 싶습니까? 그것은 내부 루프 때문에 포인터를 업데이트하는 것입니까? – Willll

답변

3

두 번째가 좋습니다. 제

lo == hi
  • 처리
    • 는 외부 루프의 상태를 반복한다.
    • charAt도 동일한 색인에 대해 반복됩니다. (두 번째 cTail은받지 못했을 수도 있습니다.)

    두 번째는 덜 복잡하고 lazier하며 작은 케이스를 처리하고, 작은 단계를 쉽게 확인할 수 있습니다. 루프 안에서 선언은 단지 하나의 스택 변수 변수 예약되어 오버 헤드, 없으므로

    //char cHead, cTail; 
    while(head <= tail) { 
        char cHead = s.charAt(head); 
        char cTail = s.charAt(tail); 
    

    :

    같이 멋진 스타일로 기록 될 수있다.