PAT 솔질 질문, 등급 B 1008, 순환하는 오른쪽 배열 요소

PAT 브러시 질문 등급 B 1008 (cpp)

제목 설명

       배열 A에는 N(> 0) 정수가 있습니다 . 다른 배열을 사용할 수 없다는 전제하에 각 정수는 순환 적으로 오른쪽 M(≥0) 위치 로 이동합니다. 즉, A의 데이터가 (A 0 A 1 에서 변경됨) a ⋯ N-. 1 )은 (a N-M ⋯ a N. 1- a 0 a . 1 ⋯ a N-M-. 1 )로 변환됩니다 (마지막 사이클 번호 M M은 맨 앞으로 이동). 프로그램이 데이터를 이동하는 횟수가 가능한 한 적다는 것을 고려할 필요가 있다면 이동 방법을 설계하는 방법은 무엇입니까?

입력 형식

       각 입력은 테스트 케이스를 포함하고 첫 번째 라인은 입력 N(1 ≤ N≤100 및 M(≥0)는 두 번째 행은 N공백으로 구분 정수.

출력 형식

       오른쪽으로 회전 출력 라인 M정수 시퀀스를 비트 뒤에 공백으로 구분하고 시퀀스의 끝은 추가 공백을 가질 수 없습니다.

입력 샘플

6 2
1 2 3 4 5 6

샘플 출력

5 6 1 2 3 4

문제 분석

       이 문제는 출력 원을 배열의 오른쪽으로 이동시키는 것입니다. 따라서 이동하지 않고, 즉 오른쪽으로 이동해야하는 첫 번째 숫자, 즉 input의 위치MMMNN찾는 쉬운 방법이있을 수 있습니다. 그런 다음 오른쪽 을 만들기 위해 필요한 처리를합니다. 나머지는 배열이 올바른 위치 로만 이동할 수 있기 때문 입니다. 그런 다음 별도로 출력합니다.
       이 방법은 시간적으로 비싸지 않지만 O (n) 수준입니다.

암호

핵심 코드는 다음과 같습니다.

void RightMove(int *num,int n,int length) {
    
    
'''
num:输入的数组A
n:要移动的长度
length:数组长度
'''
	if(n%length!=0){
    
     //当且仅当n不是length的倍数,我们才对数组分别输出
		n = n % length;
		for (int i = length - n; i < length; i++) {
    
     //先输出要右移的那些数
			cout << num[i] << " "; //如果能用printf会更快
	    }
	    for (int i = 0; i < length - n; i++){
    
     //在输出剩下的那些数
		    cout << num[i];
		    if (i != length - n - 1)
				cout << " ";
	    }
	}
	else{
    
    
		for (int i = 0; i < length; i++) {
    
    //n是length的倍数,直接输出就好了
			cout << num[i];
			if(i!=length-1)
				cout <<" ";
		}
	}
}

전체 코드는 다음과 같이 구현됩니다.

       代码在这里鸭~

구현 실행

       弱弱求赞(미즈노 ¯3¯) づ ╭❤ ~
구현 실행

추천

출처blog.csdn.net/ThunderF/article/details/93340651