{ }codelper
列表切片取余P0032

列表向右旋转

第一行给出整数个数 n 和旋转次数 k,第二行给出 n 个整数。
把列表向右旋转 k 格,用一个空格隔开输出在一行。
旋转一格会把最后一个值移到最前面(1 2 3 4 5 旋转 2 格得 4 5 1 2 3)。
k 可能大于 n,旋转 n 格后与原来相同。

输入
1 ≤ n ≤ 100,0 ≤ k ≤ 1,000,000,000,-1000 ≤ 每个整数 ≤ 1000
输出
旋转后的列表,一行
样例 1 · stdin
5 2
1 2 3 4 5
stdout
4 5 1 2 3
样例 2 · stdin
5 7
1 2 3 4 5
stdout
4 5 1 2 3
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

其他语言怎么写?查看各语言题解 · 8 种语言题解

先用 k %= n 缩小。
一格一格转 k 次在 k = 10 亿时太慢;不缩小就用 Python a[-k:] + a[:-k],k > n 时 a[-k:] 是整个列表,结果原样不动。
切片:Python a[n-k:] + a[:n-k],JS a.slice(n - k),C# a[(n-k)..],C++ std::rotate,Craykon a.子列表(n - k, k)。
位置公式 (i - k + n) % n 去掉 + n,在 C、C++、Java、C#、JS 中 -1 % 5 是 -1,会读到数组外(只有 Python 得 4)。

Pythonmain.py · 4 行
n, k = map(int, input().split())a = input().split()k %= nprint(" ".join(a[n - k:] + a[:n - k]))
JavaScriptmain.js · 5 行
const [first, second] = require("fs").readFileSync(0, "utf8").split("\n");const [n, k0] = first.trim().split(/\s+/).map(Number);const a = second.trim().split(/\s+/);const k = k0 % n;console.log([...a.slice(n - k), ...a.slice(0, n - k)].join(" "));
TypeScriptmain.ts · 6 行
import { readFileSync } from "node:fs";const [first, second] = readFileSync(0, "utf8").split("\n");const [n, k0]: number[] = first.trim().split(/\s+/).map(Number);const a: string[] = second.trim().split(/\s+/);const k: number = k0 % n;console.log([...a.slice(n - k), ...a.slice(0, n - k)].join(" "));
JavaMain.java · 15 行
import java.util.Scanner;import java.util.StringJoiner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        int k = sc.nextInt() % n;        int[] a = new int[n];        for (int i = 0; i < n; i++) a[i] = sc.nextInt();        StringJoiner out = new StringJoiner(" ");        for (int i = 0; i < n; i++) out.add(String.valueOf(a[(i - k + n) % n]));        System.out.println(out);    }}
C#Main.cs · 13 行
using System;using System.Linq; class Program{    static void Main()    {        int[] nk = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();        int n = nk[0], k = nk[1] % n;        string[] a = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);        Console.WriteLine(string.Join(" ", a[(n - k)..].Concat(a[..(n - k)])));    }}
C++main.cpp · 13 行
#include <algorithm>#include <iostream>#include <vector> int main() {    int n, k;    std::cin >> n >> k;    std::vector<int> a(n);    for (int& x : a) std::cin >> x;    std::rotate(a.begin(), a.end() - k % n, a.end());    for (int i = 0; i < n; i++) std::cout << (i ? " " : "") << a[i];    std::cout << "\n";}
Cmain.c · 14 行
#include <stdio.h> int main(void) {    int n, k, a[100];    scanf("%d %d", &n, &k);    for (int i = 0; i < n; i++) scanf("%d", &a[i]);    k %= n;    for (int i = 0; i < n; i++) {        if (i > 0) putchar(' ');        printf("%d", a[(i - k + n) % n]);    }    putchar('\n');    return 0;}
Craykonmain.cray · 10 行
nk = 控制台.读数字();n = nk[0];k = nk[1] % n;a = 控制台.读数字();result = a.子列表(n - k, k);遍历 (x 在 a.子列表(0, n - k)){    result.添加(x);}控制台.输出(result);