문제
최근의 인터뷰에서 하나 독특한 질문을 요청 되었습니다
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
편집:그냥 발견이 당신의 순서,그것을 반대로 도달할 때 상한.는 불쾌한 경우에는 지정된 질문입니다.
그것은 오래된 스레드가 필요 같은 알고리즘,그리고 좋은 솔루션입니다.솔루션
- 에서 시작할 수 있습니다 어떤 요소의 배열
- 시작할 수 있습니 반복하는 어떤 방향으로
- 전달 모든 요소에서 시작하여,다음의 방향으로 움직
- 이 중복을 처음/마지막 때 테두리 요소에 도달
모든 매 단 하나 줄 대 루프 연산자,다른 코드를 미리보기 편리합니다.
// 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)과 역방향 운동이다.