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의 위치M
M
M
N
N
를 찾는 쉬운 방법이있을 수 있습니다. 그런 다음 오른쪽 을 만들기 위해 필요한 처리를합니다. 나머지는 배열이 올바른 위치 로만 이동할 수 있기 때문 입니다. 그런 다음 별도로 출력합니다.
이 방법은 시간적으로 비싸지 않지만 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¯) づ ╭❤ ~