华为OD机试 - 约瑟夫问题(Java 2024 E卷 200分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

输入一个由随机数组成的数组(数组中每个数均是大于 0 的整数,长度已知),和初始计数值m。

从数组首位置开始计数,计数到 m 后,将数组该位置数值替换为计数值m,并将数组该位置数值出列,然后从下一个位置重新开始计数,直到数组所有数值出列为止。

如果计数到达数组尾部,则回到数组首位置继续计数。

请编程实现上述计数过程,同时输出数组出列的顺序。

例如:输入的随机数列为 3,1,2,4,初始计数值 m=7,从数组首位置开始计数(数值 3 所在位置)。

第一轮计数出列数字为 3,计数值更新为 m=2,出列后数组为 3,1,4,从数组 4 所在位置重新计数。

第一轮计数出列数字为 3,计数值更新为 m=3,出列后数组为 3,1,4,从数组 4 所在位置重新计数。

第一轮计数出列数字为 1,计数值更新为 m=1,出列后数组为 4,从数组 1 所在位置重新计数。

最终输出:2,3,1,4。

要求实现函数:

void array_iterate(int len, int input_array[], int m, int output_array[])

二、输入描述

int len:输入数组的长度;
int input_array[]:输入的初始数组;
int m:初始计数值。

三、输出描述

output_array[]:输出的数组出列顺序。

四、解题思路

  1. 使用ArrayList来存储输入数组,因为ArrayList支持动态删除元素和随机访问,便于模拟循环数组的行为。
  2. 初始化一个ArrayList,将输入数组的元素添加进去。
  3. 使用一个索引变量currentIndex表示当前计数的位置,初始值为0。
  4. 在每次循环中,根据当前的计数值m计算出要移除的元素的位置,计算公式为(currentIndex + m - 1) % list.size(),这样可以实现循环计数。
  5. 移除该位置的元素,将其值赋给m,并将该元素添加到输出数组中。
  6. 更新currentIndex为被移除位置的下一个位置,继续下一轮计数。
  7. 重复上述过程,直到所有元素都被移除。

五、Java算法源码

public class OdTest {
    // 实现数组迭代的函数
    void array_iterate(int len, int input_array[], int m, int output_array[]) {
        // 将输入数组转换为ArrayList,便于动态删除元素
        List<Integer> list = new ArrayList<>();
        for(int num : input_array) {
            list.add(num);
        }

        int currentIndex = 0; // 当前计数的位置
        int outputIndex = 0;   // 输出数组的索引

        while(!list.isEmpty()) {
            // 计算移除元素的位置
            currentIndex = (currentIndex + m - 1) % list.size();
            // 获取要移除的元素
            int removed = list.get(currentIndex);
            // 将移除的元素赋值为m并放入输出数组
            output_array[outputIndex++] = removed;
            // 更新计数值m为移除的元素值
            m = removed;
            // 移除元素
            list.remove(currentIndex);
        }
    }

    public static void main(String[] args) {
        OdTest odTest = new OdTest();
        Scanner scanner = new Scanner(System.in);

        // 读取输入数组
        String inputLine = scanner.nextLine();
        String[] inputStrings = inputLine.split("[,\\s]+"); // 支持逗号和空格分隔
        int[] input_array = new int[inputStrings.length];
        for(int i = 0; i < inputStrings.length; i++) {
            input_array[i] = Integer.parseInt(inputStrings[i]);
        }

        // 读取数组长度
        int len = Integer.parseInt(scanner.nextLine().trim());

        // 读取初始计数值m
        int m = Integer.parseInt(scanner.nextLine().trim());

        // 准备输出数组
        int[] output_array = new int[len];

        // 调用函数进行处理
        odTest.array_iterate(len, input_array, m, output_array);

        // 输出结果,以逗号分隔
        for(int i = 0; i < output_array.length; i++) {
            if(i != 0) System.out.print(",");
            System.out.print(output_array[i]);
        }
    }
}

六、效果展示

1、输入

3,1,2,4
4
7

2、输出

2,3,1,4

3、说明

第一行是初始数组input_array。
第二行是初始数组的长度len。
第三行是初始计数值m。


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 E卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

华为OD机试 - 处理器问题。 在华为OD机试中,处理器问题是其中一个重要的内容。处理器是计算机系统的核心组件,负责执行所有的计算任务和指令。以下是对处理器问题的回答: 处理器是一种位于计算机内部的电子设备,它负责从内存中获取指令和数据,并执行这些指令。处理器的性能直接影响计算机的整体运行速度和效率。在华为OD机试中,处理器问题可能涉及到以下几个方面: 1. 处理器的种类和架构:处理器的种类包括单核、双核、四核等不同型号和规格的处理器。不同种类的处理器采用了不同的架构设计,如ARM、x86等。应根据具体的问题了解各种处理器的特点和适用场景。 2. 处理器的性能参数:处理器的性能可以通过多种指标来评估,如主频、核心数、缓存大小、功耗等。在处理器问题中,可能需要对处理器的性能参数进行析和比较,来选择合适的处理器。 3. 处理器的调度算法:在多任务环境下,处理器需要根据不同的调度算法来配资源和管理任务。例如,可以采用先来先服务、时间片轮转等调度算法。处理器问题可能会涉及到如何选择合适的调度算法,以提高系统的整体性能。 4. 处理器的优化技术:为了提高处理器的性能和效率,可以采用一系列的优化技术。例如,使用流水线、超标量、超线程等技术来提高指令并行度;使用缓存技术来提高内存访问速度等。处理器问题可能需要对这些优化技术进行了解和应用。 综上所述,处理器问题是华为OD机试中一个重要的内容,需要对处理器的种类、架构、性能参数、调度算法以及优化技术进行了解和应用。只有掌握了这些知识,才能在处理器问题中做出准确的判断和正确的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值