{ }codelper
交换元素P0312

两两结对交换位置

体操课上 n 名学生站成一排,位置从左起编号为 1, 2, …, n。
第一行给出 n 和 s,用一个空格分开。
第二行按位置顺序给出学生的 n 个号码,用一个空格分开。
老师一吹哨,就从 s 号位置开始向右每两人依次结成一对。
也就是 s 号和 s+1 号是一对,s+2 号和 s+3 号是一对,这样一直到队尾。
结成一对的两名学生互相交换位置。
没有搭档的学生留在原地不动。
s 为 2 时的 1 号位置的学生,以及队尾落单的学生,就是没有搭档的学生。
按位置顺序输出交换后的号码,用一个空格分开,占一行。

输入
1 ≤ n ≤ 100,s 为 1 或 2,1 ≤ 号码 ≤ 999(整数),号码互不相同
输出
一行,n 个号码用一个空格分开
样例 1 · stdin
5 1
10 20 30 40 50
stdout
20 10 40 30 50
样例 2 · stdin
5 2
10 20 30 40 50
stdout
10 30 20 50 40
main.py
输入(stdin)

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

$ 就绪

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

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

交换两个位置的写法因语言而异。
Python a[i], a[i + 1] = a[i + 1], a[i]、JS/TS [a[i], a[i + 1]] = [a[i + 1], a[i]]、C# (a[i], a[i + 1]) = (a[i + 1], a[i])、C++ std::swap(a[i], a[i + 1]) 一行就能交换。
C、Java、Craykon 先把一边存到临时变量里,用三行交换。
第一个陷阱是不用临时变量,写成 a[i] = a[i + 1]; a[i + 1] = a[i];。
第一句就把 a[i] 原来的值弄丢了,样例 1 变成 20 20 40 40 50。
第二个陷阱是循环的终点。
一对中右边的位置 i + 1 必须在列表内,所以条件是 i + 1 < n。
用 i < n 的话,落单的最后一名学生会和列表外的位置交换。
在样例 1 中,Python 以 IndexError 停下,Craykon 提示列表只有 0~4 号并停下。
JS 不报错,而是和不存在的位置的 undefined 交换,列表多出一格,输出 20 10 40 30 之后是两个空格和 50。
C、C++ 不检查范围,可能不报错地读到无关的值。
第三个陷阱是编号。
位置编号 s 从 1 数起,列表下标从 0 数起,所以要从下标 s − 1 开始。
直接用 s 会错开一格;不看 s 总是从最前面开始,样例 2 就变成 20 10 40 30 50。

Pythonmain.py · 6 行
n, s = map(int, input().split())a = list(map(int, input().split()))# 자리 번호 s는 1부터 세므로 목록에서는 s - 1번 칸이다for i in range(s - 1, n - 1, 2):    a[i], a[i + 1] = a[i + 1], a[i]   # 임시 변수 없이 한 줄로 맞바꾼다print(*a)
JavaScriptmain.js · 6 行
const [n, s, ...a] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);// 짝의 오른쪽 칸(i + 1)이 목록 안에 있을 때만 바꾼다for (let i = s - 1; i + 1 < n; i += 2) {  [a[i], a[i + 1]] = [a[i + 1], a[i]];}console.log(a.join(" "));
TypeScriptmain.ts · 7 行
import { readFileSync } from "node:fs";const [n, s, ...a]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);// 짝의 오른쪽 칸(i + 1)이 목록 안에 있을 때만 바꾼다for (let i = s - 1; i + 1 < n; i += 2) {  [a[i], a[i + 1]] = [a[i + 1], a[i]];}console.log(a.join(" "));
JavaMain.java · 22 行
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        int s = sc.nextInt();        int[] a = new int[n];        for (int i = 0; i < n; i++) a[i] = sc.nextInt();        for (int i = s - 1; i + 1 < n; i += 2) {            int tmp = a[i];      // 한쪽을 먼저 맡겨 둔다            a[i] = a[i + 1];            a[i + 1] = tmp;        }        StringBuilder out = new StringBuilder();        for (int i = 0; i < n; i++) {            if (i > 0) out.append(' ');            out.append(a[i]);        }        System.out.println(out);    }}
C#Main.cs · 17 行
using System; class Program{    static void Main()    {        string[] first = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);        int n = int.Parse(first[0]);        int s = int.Parse(first[1]);        int[] a = Array.ConvertAll(Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries), int.Parse);        for (int i = s - 1; i + 1 < n; i += 2)        {            (a[i], a[i + 1]) = (a[i + 1], a[i]);   // 튜플로 한 줄에 맞바꾼다        }        Console.WriteLine(string.Join(" ", a));    }}
C++main.cpp · 15 行
#include <iostream>#include <utility>#include <vector> int main() {    int n, s;    std::cin >> n >> s;    std::vector<int> a(n);    for (int& x : a) std::cin >> x;    for (int i = s - 1; i + 1 < n; i += 2) {        std::swap(a[i], a[i + 1]);    }    for (int i = 0; i < n; i++) std::cout << (i ? " " : "") << a[i];    std::cout << "\n";}
Cmain.c · 15 行
#include <stdio.h> int main(void) {    int n, s, a[100];    scanf("%d %d", &n, &s);    for (int i = 0; i < n; i++) scanf("%d", &a[i]);    for (int i = s - 1; i + 1 < n; i += 2) {        int tmp = a[i];      /* 한쪽을 먼저 맡겨 둔다 */        a[i] = a[i + 1];        a[i + 1] = tmp;    }    for (int i = 0; i < n; i++) printf(i ? " %d" : "%d", a[i]);    printf("\n");    return 0;}
Craykonmain.cray · 12 行
첫줄 = 控制台.读数字();n = 첫줄[0];s = 첫줄[1];a = 控制台.读数字();循环 (i = s - 1; i + 1 < n; i += 2){    // 한쪽을 먼저 임시로 맡겨 둔다    임시 = a[i];    a[i] = a[i + 1];    a[i + 1] = 임시;}控制台.输出(a);