首页 > 试题广场 >

小红的环形数组

[编程题]小红的环形数组
  • 热度指数:1280 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小红拿到了一个环形数组(第一个元素的左边是最后一个元素,最后一个元素的右边是第一个元素),她有若干次询问,每次查询从某元素开始,向左/向右前进k步后在什么位置。你能帮帮她吗?

输入描述:
第一行输入两个正整数n,q,代表数组大小和询问次数。
第二行输入n个正整数a_i,代表数组的元素。
接下来的q行,每行输入三个参数x,op,k,其中x为一个正整数,代表初始的位置;op为一个字符'L'或者'R','L'代表向左走,'R'代表向右走;k代表走的步数。

1\leq n,q \leq 10^5
1\leq x \leq n
1\leq k,a_i \leq 10^9


输出描述:
输出q行,每行输出一个正整数,代表每次查询,前进k步后所在的元素。
示例1

输入

5 2
3 4 5 2 4
1 R 3
4 L 4

输出

2
4

说明

第一次询问,小红初始在第一个元素,向右走 3 步后到达第四个元素,是 2。
第二次询问,小红初始在第四个元素,向左走 4 步后到达第五个元素,是 4。

import sys

wuhu = sys.stdin.readline()
qifei = sys.stdin.readline()
malaoshi = qifei.split()

my_list = []
my_list.extend(malaoshi)

for line in sys.stdin:
    a = line.split()
    if a[1] == 'R':
        print(my_list[(int(a[0])-1 + int(a[2]))%len(my_list)])
    if a[1] == 'L':
        print(my_list[(int(a[0])-1 - int(a[2]))%len(my_list)])

发表于 2025-03-04 11:52:54 回复(0)
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int a,b;
    cin>>a>>b;
    vector<int> nums(a);
    for(int i=0;i<a;i++){
        cin>>nums[i];
    }
    int ans=0;
    while(b--){
        int left,right;
        char s;
        cin>>left>>s>>right;
        right%=a;
        if(s=='R')ans=(left+right-1)%a;
        if(s=='L')ans=(left-right+a-1)%a;
        cout<<nums[ans]<<endl;
    }
   
}
发表于 2025-04-21 19:50:35 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
     public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();  // 数组大小
        int q = sc.nextInt();  // 询问次数
        
        long[] a = new long[n];  // 环形数组
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextLong();
        }
        
        // 处理每个查询
        for (int i = 0; i < q; i++) {
            int x = sc.nextInt();  // 初始位置
            String op = sc.next();  // 操作方向 L 或 R
            long k = sc.nextLong();  // 步数
            int kk=(int)(k%n); //减少计算量
            // 将x从1基准调整为0基准
            x--;
            
            // 计算新位置
            if (op.equals("R")) {
                // 向右走 k 步
                
                System.out.println(a[(x + kk) % n]);
            } else if (op.equals("L")) {
                // 向左走 k 步
                System.out.println(a[(x - kk + n) % n]);
            }
        }
    }
}
发表于 2025-04-17 14:37:11 回复(0)