线性表的全操作

题目来源:学堂在线_清华大学_JAVA程序设计进阶

 

题目描述:

如题。

给定一个线性表,如果你不知道什么是线性表,可以去看看数据结构。

当然,简单的说就是给一组数。

一共有如下5种操作:

1 index:查询第index位置上的数,如果index非法,则输出-1

2 index value:在第index位置上插入一个数value,原来的数依次后移,如果index非法则不操作

3 index:删除第index位置上的数,其后的数依次前移。如果index非法则不操作

4 index n v1 v2 ... vn:从第index位置依次插入v1到vn的n个数,原来的数后移。如果index非法则不操作。

5 index n: 从第index位置往后依次删除n个数,其后的数依次前移。如果index非法则不操作,如果index及其之后不够n个数,则将index及其之后的数全部删除即可。

对每一个1指令,打印输出查询到的数值。

初始时,表是空的。

特别的,index从1开始,也就是说表首元素是第1个元素,而不是第0个。

另外需要注意的是:插入操作与删除操作中index的合法范围是不一样的!

本题出现的所有数据均是正的int类型。

本题的输入功能由系统完成,无需学员编写。

因此本题不提供输入输出样例,学员按照题目描述进行处理输出即可。


 

package chapter07.test02;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

//表示指令的对象
class Cmd {
    int cmd;        //只能取值1~5
    int index;      //操作的位置
    int nOrValue;   //cmd为1时,该域无用
    //cmd为2时,该域表示value
    //cmd为3时,该域无用
    //cmd为4时,该域表示n
    //cmd为5时,该域表示n
    Integer[] params;  //cmd为4时,该域含n个int
}

public class test02 {
    public static void main(String[] args) {
        Cmd[] commands = getCmd();//获取指令序列

        //学员需要自行定义数据以及设计程序以完成题目指定的任务
        /***being your code here****/
        List<Integer> a = new ArrayList<>();
        for (Cmd cmd : commands) {
            int idx = cmd.index - 1;

            switch (cmd.cmd) {
                case 1: {//查询
                    if (0 <= idx && idx < a.size()) {
                        System.out.println(a.get(idx));
                    } else {
                        System.out.println("-1");
                    }
                }
                break;
                case 2: {//插入
                    int value = cmd.nOrValue;
                    if (0 <= idx && idx <= a.size()) {
                        a.add(idx, value);
                    }
                }
                break;
                case 3: {//删除
                    if (0 <= idx && idx < a.size()) {
                        a.remove(idx);
                    }
                }
                break;
                case 4: {
                    if (idx < 0 || idx > a.size()) break;
                    List<Integer> t = Arrays.asList(cmd.params);
                    a.addAll(idx, t);
                }
                break;
                case 5: {
                    if (idx < 0 || idx >= a.size()) break;
                    int n = cmd.nOrValue;
                    while (idx != a.size() && n > 0) {
                        a.remove(idx);
                        --n;
                    }
                }
                break;
            }
        }

        /***end your code****/
    }

    //生成指令序列,学员可以无视
    public static Cmd[] getCmd() {
        Scanner cin = new Scanner(System.in);
        A = cin.nextInt();
        B = cin.nextInt();
        M = cin.nextInt();
        X = cin.nextInt();
        cin.close();

        int n = get();
        Cmd[] ret = new Cmd[n];
        ret[0] = new Cmd();
        ret[0].cmd = 4;
        ret[0].index = 1;
        ret[0].nOrValue = get();
        ret[0].params = new Integer[ret[0].nOrValue];
        for (int i = 0; i != ret[0].nOrValue; ++i) ret[0].params[i] = get();

        for (int i = 1; i != n; ++i) {
            Cmd cmd = new Cmd();
            cmd.cmd = get() % 5 + 1;
            switch (cmd.cmd) {
                case 1:
                    cmd.index = get();
                    break;
                case 2:
                    cmd.index = get();
                    cmd.nOrValue = get();
                    break;
                case 3:
                    cmd.index = get();
                    break;
                case 4:
                    cmd.index = get();
                    cmd.nOrValue = get();
                    cmd.params = new Integer[cmd.nOrValue];
                    for (int j = 0; j != cmd.nOrValue; ++j) cmd.params[j] = get();
                    break;
                case 5:
                    cmd.index = get();
                    cmd.nOrValue = get();
                    break;
            }
            ret[i] = cmd;
        }
        return ret;
    }

    //学员可以无视
    private static int A, B, M, X;

    private static int get() {
        X = (A * X + B) % M;
        return X;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值