문제

최근의 인터뷰에서 하나 독특한 질문을 요청 되었습니다

a[]= { 1,2,3,4,5,6,7,8,9,10}

배열이 있는 경우 주어진으로 지정된 시작하는 색인을 반복할 때까지 그것을 트래버스 모든 요소입니다.

나는 것을 의미한다고 가정 시작 지수는"5"내가에서 시작 6,7,8,9,10,5,4,3,2,1.주의 깊게 보면 시퀀스,할 수 있습니다 어떻게 해야 하나를 만들 Reset(), 현재,저쩌구...?.

하지만 면접관을 실행 순서로 그는 물었다.그는 보이지 않았습니다.

우리는 정말을 개발하고 논리에 대한 이상한 필요조건입니까?

도움이 되었습니까?

해결책

그냥 사용하여 두 개의 루프가 있습니다.

IEnumerable<int> ForwardsBackwards(int[] a, int start) {
    for(int i=start; i<a.Length; i++) 
        yield return a[i];
    for(int i=start-1; i>=0; i--) 
        yield return a[i];
}

편집:더 linq:

IEnumerable<int> ForwardBackward(int[] a, int start) {
    return a.Skip(start).Concat(a.Take(start).Reverse());
}

다른 팁

유지하는 쉬운(?):

        int[] a= {1,2,3,4,5,6,7,8,9,10};

        int StartIndex=5;

        for (int iCount = StartIndex; iCount < a.Count() + StartIndex; iCount++)
        {
            Debug.WriteLine(a[(iCount + a.Count()) % a.Count()]);
        }

출력:

6 7 8 9 10 1 2 3 4 5

편집:그냥 발견이 당신의 순서,그것을 반대로 도달할 때 상한.는 불쾌한 경우에는 지정된 질문입니다.

그것은 오래된 스레드가 필요 같은 알고리즘,그리고 좋은 솔루션입니다.솔루션

  1. 에서 시작할 수 있습니다 어떤 요소의 배열
  2. 시작할 수 있습니 반복하는 어떤 방향으로
  3. 전달 모든 요소에서 시작하여,다음의 방향으로 움직
  4. 이 중복을 처음/마지막 때 테두리 요소에 도달

모든 매 단 하나 줄 루프 연산자,다른 코드를 미리보기 편리합니다.

// Example program
#include <iostream>
#include <string>

int a[] = {0,1,2,3,4,5};
int Count = sizeof(a)/sizeof(int);

void LoopFromMidWithDirection ( int curIdx , int motion )
{
    std::cout << "\nNextFrom=" << curIdx << " motion =" << motion << "\n";
    curIdx +=motion;
    for (int i = curIdx; (i - curIdx) * motion < Count ; i += motion)
        std::cout << a[(i + Count) % Count] << " ";

    std::cout << "\n";
}

int main()
{
    LoopFromMidWithDirection(4, +1);
    LoopFromMidWithDirection(6, +1);
    LoopFromMidWithDirection(0, -1);
}

출력

NextFrom=4 motion =1
5 0 1 2 3 4 

NextFrom=6 motion =1
1 2 3 4 5 0 

NextFrom=0 motion =-1
5 4 3 2 1 0 

솔루션에서 영감을@닐 킴버

예,당신을 구현해야 합니다 IEnumerator 인터페이스에 사용자 지정 클래스입니다.쓰 논리로 MoveNext 방법을 감지하는 엔드의 배열의 시작 부분에서 시작하여 배열,기억이의 중간 방식으로 시작점이다.

따라 이러한 샘플 코드 로 마이크로소프트에 의해합니다.

(DEFINE (traverse length start call) 
  (DEFINE (flow index motion)
    (cond ((> index length) 
              (flow (- start 1) -1))
          ((> index -1) 
              ((call index) (flow (+ index motion) motion)))))
  (flow start +1))

(traverse 9 5 job)

나는 다음과 같 9 5 의 질문입니다.내가 궁금해 그들은 경을 암시하는 뭔가?가 job 출력하는 배열 색인을 생산할 것 이라고 678954321.

C 나 유혹하 for 루프를 사용하지 않음(동안 반복이 있었으며,그것은 전에 편집);

int a[]= { 1,2,3,4,5,6,7,8,9,10};
int length = 10;
int start = 5;
int motion = 1; //increment

for( int index = start; index >= 0; index += motion ) {
  if(index > (length-1)) {
    motion = -1; //decrement
    index = start -1;
  else {
    printf("%d", a[index]);
  }
}

프로세스가 끝난 후에 당신을 인쇄 제 index.시간 당신과 배열이 있을 때는 초과했습니다.그렇게 될 때,당신은 반환하는 인덱스 시작(-1)과 역방향 운동이다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top