报数游戏 - 华为OD统一考试(E卷)

news/2024/9/29 18:28:37/

2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集

华为OD机试

题目描述

100个人围成一圈,每个人有一个编号,编号从1开始到100。他们从1开始依次报数,报到为M的人自动退出圈圈,然后下一个人接着从1开始报数,直到剩余的人数小于M。请问最后剩余的人在原先的编号为多少?

输入描述

输入一个整数参数M。

输出描述

如果输入参数M小于等于1或者大于等于100,输出"ERROR!";否则按照原先的编号从小到大的顺序,以逗号分割输出编号字符串。

示例1

输入:
3输出:
58,91说明:
输入M为3,最后剩下两个人

示例2

输入:
4输出:
34,45,97说明:
输入M为4,最后剩下三个人

题解

该问题属于循环链表问题,可以通过约瑟夫环(Josephus Problem)的思路来解决。这类问题的关键在于模拟一个按固定规则报数和删除的过程。通过循环报数,每次删除报到特定数字的人,并在下次从紧邻剩下的人重新开始报数,直到剩下的人数少于M。


解题思路:

  1. 输入校验:首先检查输入的整数参数 M 是否在有效范围(1 < M < 100)内。如果无效则输出 "ERROR!"
  2. 初始化队列:使用一个列表或者链表来保存1到100的编号。这个队列将模拟人围成一圈的情况。
  3. 循环删除元素:从编号为1开始报数,每当报到数字 M 时,移除该人(即从队列中删除该元素),并从下一个人重新开始报数。
  4. 处理循环:为了模拟围成一圈的过程,当到达列表末尾时,需要从头继续开始报数。
  5. 输出结果:当剩下的人数少于 M 时,按照编号升序输出剩下的编号,以逗号分隔。

Java

java">import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;/*** @author code5bug*/
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int M = sc.nextInt();if (M <= 1 || M >= 100) {System.out.println("ERROR!");return;}List<String> nums = new LinkedList<>();for (int i = 1; i <= 100; i++) {nums.add(String.valueOf(i));}Iterator<String> it = nums.iterator();for (int now = 1; nums.size() >= M; now++) {if (!it.hasNext()) it = nums.iterator(); // 回到开头it.next(); // 遍历下一个if (now == M) {// 注意: Iterator 的 remove() 方法只能在调用 next() 之后使用it.remove();now = 0;}}System.out.println(String.join(",", nums));	// 输出剩余元素}
}

Python

python">def main():M = int(input())if M <= 1 or M >= 100:print("ERROR!")returnnums = [str(i) for i in range(1, 101)]  # 初始化编号列表index = 0now = 1while len(nums) >= M:if now == M:nums.pop(index)	# 删除当前编号now = 0	# 重置计数else:# 如果当前位置是最后一个元素,回到第一个位置(循环列表效果)index = (index + 1) % len(nums)now += 1print(",".join(nums))	# 输出剩余编号if __name__ == "__main__":main()

C++

#include <bits/stdc++.h>
using namespace std;int main()
{int M;cin >> M;if (M <= 1 || M >= 100) {cout << "ERROR!" << endl;return 0;}list<int> nums;for (int i = 1; i <= 100; i++) nums.push_back(i);int now = 1;for (auto it = nums.begin(); nums.size() >= M; now++) {if (it == nums.end()) it = nums.begin();   // 回到链表开头if (now == M) {// 注意这里 it = 不要漏写it  = nums.erase(it);   // 删除当前元素并更新迭代器now = 0;                // 重置计数} else {it++;}}for (auto it = nums.begin(); it != nums.end();) {cout << *it;if (++it != nums.end()) cout << ",";}cout << endl;return 0;
}

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏


http://www.ppmy.cn/news/1532035.html

相关文章

基于RustDesk自建远程桌面服务

最近向日葵越来越难用了&#xff0c;官方好像限制了免费用户的带宽&#xff0c;但是限制的有点过头了&#xff0c;卡的基本没法用。 向日葵的平替todesk对于免费用户又有时长限制&#xff0c;对于经常用的小伙伴不大友好。 咱也不是说非得白嫖&#xff0c;但是向日葵和todesk这…

Java工具--stream流

Java工具--stream流 过滤&#xff08;filter&#xff09;统计求最大最小和均值求和&#xff08;sum&#xff09;过滤后&#xff0c;对数据进行统计 遍历&#xff08;map&#xff09;规约&#xff08;reduce&#xff09;排序&#xff08;sorted&#xff09;去重&#xff08;dist…

通信工程学习:什么是MIMO多输入多输出技术

MIMO:多输入多输出技术 MIMO(Multiple-Input Multiple-Output)多输入多输出技术是一种在无线通信中广泛应用的技术,它通过利用多个天线进行数据传输和接收,可以显著提高无线通信系统的性能和容量。以下是对MIMO技术的详细解释: 一、定义与原理 MIMO技术…

大模型培训讲师叶梓:Llama Factory 微调模型实战分享提纲

LLaMA-Factory ——一个高效、易用的大模型训练与微调平台。它支持多种预训练模型&#xff0c;并且提供了丰富的训练算法&#xff0c;包括增量预训练、多模态指令监督微调、奖励模型训练等。 LLaMA-Factory的优势在于其简单易用的界面和强大的功能。用户可以在不编写任何代码的…

数组组成的最小数字 - 华为OD统一考试(E卷)

2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集 题目描述 给定一个整型数组,请从该数组中选择3个元素组成最小数字并输出(如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 一行用半角逗号分割的字符串记录的整型数组,0<数…

golang学习笔记32——哪些是用golang实现的热门框架和工具

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…

3D线上会议:开启沉浸式交流的新时代

在数字化转型的浪潮中&#xff0c;传统的线上会议模式正经历一场深刻的变革&#xff0c;由3D线上会议技术引领的新风尚正席卷而来。这一创新形式&#xff0c;通过虚拟化身与3D互动环境的无缝融合&#xff0c;为远程协作带来了前所未有的沉浸感与互动体验&#xff0c;彻底重塑了…

Android使用RecyclerView仿美团分类界面

RecyclerView目前来说对大家可能不陌生了。由于在公司的项目中&#xff0c;我们一直用的listview和gridview。某天产品设计仿照美团的分类界面设计了一个界面&#xff0c;我发现用gridview不能实现这样的效果&#xff0c;所以就想到了RecyclerView&#xff0c;确实是一个很好的…