华为机试 - 约瑟夫问题

【华为OD机试真题 Python语言】193、约瑟夫问题 | 机试真题+思路参考+代码分析 输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知) ,和初始计数值m >  从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止 >  如果计数到达数列尾段,则返回数列首位置继续计数 >  请编程实现上述计数过程,同时输出数值出列的顺序 >  比如:输入的随机数列为: 3,1,2,4, 初始计数值m=7,从数列首位置开始计数(数值3所在位置) >  第一 阅读详情

约瑟夫问题1

一组人(n个),围成一圈,从某人开始数到第三个的人出列,再接着从下一个人开始数,最终输出最终出列的人

(约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。)

#include <iostream>
#include <list>
using namespace std;

struct ListNode
{
	int val;
	ListNode *link;
	ListNode(int v):val(v),link(NULL){ }
};

void array_iterate(int len, int k, int m, int output_array[])
{
	ListNode *head=new ListNode(1);
	ListNode *temp=head;
	for(int i=2;i<=len;i++)
		temp->link=new ListNode(i),temp=temp->link;
	temp->link=head;
	ListNode *prev=temp;
	temp=head;
	int index=0;
	while (k!=1)
	{
		prev=temp;
		temp=temp->link;
		k--;
	}
	k=m;
	while (temp!=prev)
	{
		while (m!=1)
		{
			prev=temp;
			temp=temp->link;
			m--;
		}
		output_array[index++]=temp->val;
		m=k;
		prev->link=temp->link;
		delete temp;
		temp=prev->link;
	}
	output_array[index]=temp->val;
	delete temp;
}

int main()
{
	int len;
	cin>>len;
	int *output_array=new int[len]();
	int k,m;
	cin>>k>>m;
	array_iterate(len,k,m,output_array);
	for (int i=0;i<len;i++)
	{
		cout<<output_array[i]<<' ';
	}
	cout<<endl;
	system("pause");
	return 0;
}



约瑟夫问题2

输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程实现上述计数过程,同时输出数值出列的顺序

比如:输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置)
第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数
第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数
第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数
最后一轮计数出列数字为4,计数过程完成。
输出数值出列顺序为:2,3,1,4。

要求实现函数:
void array_iterate(int len, int input_array[], int m, int output_array[])

【输入】 int len:输入数列的长度;
int intput_array[]:输入的初始数列
int m:初始计数值

【输出】 int output_array[]:输出的数值出列顺序

【返回】 无

示例:
输入:int input_array[] = {3,1,2,4},int len = 4, m=7
输出:output_array[] = {2,3,1,4}

#include <iostream>
#include <list>
using namespace std;

struct ListNode
{
	int val;
	ListNode *link;
	ListNode(int v):val(v),link(NULL){ }
};

void array_iterate(int len, int input_array[], int m, int output_array[])
{
	ListNode *head=new ListNode(input_array[0]);
	ListNode *temp=head;
	for(int i=1;i<len;i++)
		temp->link=new ListNode(input_array[i]),temp=temp->link;
	temp->link=head;
	ListNode *prev=temp;
	temp=head;
	int index=0;
	while (temp!=prev)
	{
		while (m!=1)
		{
			prev=temp;
			temp=temp->link;
			m--;
		}
		output_array[index++]=temp->val;
		m=temp->val;
		prev->link=temp->link;
		delete temp;
		temp=prev->link;
	}
	output_array[index]=temp->val;
	delete temp;
}

int main()
{
	int len;
	cin>>len;
	int *input_array=new int[len]();
	int *output_array=new int[len]();
	for (int i=0;i<len;i++)
	{
		cin>>input_array[i];
	}
	int m;
	cin>>m;
	array_iterate(len,input_array,m,output_array);
	for (int i=0;i<len;i++)
	{
		cout<<output_array[i]<<' ';
	}
	cout<<endl;
	system("pause");
	return 0;
}
【华为机试真题 Python实现】约瑟夫问题 文章目录前言题目描述示例 1参考代码 前言 《华为机试真题》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即非性能最优)。 题目描述 输入一个由随机数组成的数列(数列中每个数均是大于 0 的整数,长度已知), 和初始计数值 m。从数列首位置开始计数,计数到 m 后,将数列该位置数值替换计数值 m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。 如果计数到达 阅读详情

相关推荐

【华为OD机试真题 C++语言】193、约瑟夫问题 | 机试真题+思路参考+代码分析

输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知) ,和初始计数值m >  从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止 >  如果计数到达数列尾段,则返回数列首位置继续计数 >  请编程实现上述计数过程,同时输出数值出列的顺序 >  比如:输入的随机数列为: 3,1,2,4, 初始计数值m=7,从数列首位置开始计数(数值3所在位置) >  第一

KJ.JK 1887

华为招聘机试整理15:约瑟夫环

华为招聘机试整理15:约瑟夫环 题目:约瑟夫环 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 题目分析: 这道题主要是想考察链表的知识。 算法思路一:用环形链表模拟圆圈 我们这里采用模板库中的s

Voidwalkerxiaohui 1642

【华为OD机试真题 C语言】193、约瑟夫问题 | 机试真题+思路参考+代码分析

输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知) ,和初始计数值m >  从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止 >  如果计数到达数列尾段,则返回数列首位置继续计数 >  请编程实现上述计数过程,同时输出数值出列的顺序 >  比如:输入的随机数列为: 3,1,2,4, 初始计数值m=7,从数列首位置开始计数(数值3所在位置) >  第一

KJ.JK 1462

华为机试题-约瑟夫问题

记得做个一个类似的问题,就是大家围城一个圈,然后依次数数,数到特定数的退出,问最后留下谁。今天发现这原来是个很经典的问题:约瑟夫 环 约瑟夫环问题描述如下: 历史学家约瑟夫和友人以及其他39人多在山洞中躲避战乱,除约瑟夫和友人外其他人表示要集体自杀来表明自己绝不投降的志气。做法是41个人围城一个圈,然后顺时针报数,1,2,3.报数为3的人立刻自然,然后下一个人从1重新开始报数。约瑟夫和友人不想

Allen Liu 1295

华为OD机试:约瑟夫问题解析及C++、Java、JavaScript和Python多语言实现详解

约瑟夫问题是一个古老且经典的数学问题,最早起源于公元1世纪的犹太历史学家约瑟夫斯的故事。在原始版本中,一群士兵为了避免被俘,决定以一种自杀的方式来减少人数,直到只剩下最后一个幸存者。士兵们围成一个圆圈,从某个位置开始按顺时针顺序数到第m个士兵并将其移除,接着从下一个士兵重新开始数,直到所有士兵都被移除。问题的核心是:给定初始士兵数量和计数规则,找到最后一个幸存者的位置。

m0_57781768的博客 409

【华为OD机试真题】193、约瑟夫问题 | 机试真题+思路参考+代码分析(C++、Java、Py、C语言、JS)

题目描述 >输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知) ,和初始计数值m >  从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止 >  如果计数到达数列尾段,则返回数列首位置继续计数 >  请编程实现上述计数过程,同时输出数值出列的顺序 >  比如:输入的随机数列为: 3,1,2,4, 初始计数值m=7,从数列首位置开始计数(数值3所在位置) >&nb

KJ.JK 1万+

100个人围成一个圈(编号从1到100),然后报数,报到3的下去,然后从4开始继续从1开始报数,报到3的下去,依此类推,最后剩下人的编号是?

public class TestMain { public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); for (int i = 1; i <= 100; i++) { list.add(i); } int num; int flag = 0;.

meser88的博客 4233

【华为OD机试真题 Golang语言】193、约瑟夫问题 | 机试真题+思路参考+代码分析

>输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知) ,和初始计数值m >  从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止 >  如果计数到达数列尾段,则返回数列首位置继续计数 >  请编程实现上述计数过程,同时输出数值出列的顺序 >  比如:输入的随机数列为: 3,1,2,4, 初始计数值m=7,从数列首位置开始计数(数值3所在位置) >  第

KJ.JK 731

华为机试—约瑟夫环

输入人数n,开始位置s ,间隔数多少个m,输出出局序列 #include #include using namespace std; void Out(int n,int s,int m) { vector people; for (int i=1;i<=n;i++) { people.push_back(i); } int start = s-1; int

小地盘的诺克萨斯 2316

【华为机试真题Python】约瑟夫问题

输入一个由随机数组成的数列(数列中每个数均是大于 0 的整数,长度已知), 和初始计数值 m。从数列首位置开始计数,计数到 m 后,将数列该位置数值替换计数值 m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程实现上述计数过程,同时输出数值出列的顺序。

760

【华为OD机试真题 Java语言】193、约瑟夫问题 | 机试真题+思路参考+代码分析

输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知) ,和初始计数值m >  从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止 >  如果计数到达数列尾段,则返回数列首位置继续计数 >  请编程实现上述计数过程,同时输出数值出列的顺序 >  比如:输入的随机数列为: 3,1,2,4, 初始计数值m=7,从数列首位置开始计数(数值3所在位置) >  第一

KJ.JK 1526

华为机试---约瑟夫环问题

package huawei; import java.util.Scanner; /** * 约瑟夫环问题: * 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。 * 从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列; * 依此规律重复下去,直到圆桌周围的人全部出列。 * * 方法一:通过数组实现:巧妙之处是利用下标

sujianxin2012的专栏 702

【华为OD机试真题】193、约瑟夫问题 | 机试真题+思路参考+代码分析(C语言、C++、Java、Py、JS)

>输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知) ,和初始计数值m >  从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止 >  如果计数到达数列尾段,则返回数列首位置继续计数 >  请编程实现上述计数过程,同时输出数值出列的顺序 >  比如:输入的随机数列为: 3,1,2,4, 初始计数值m=7,从数列首位置开始计数(数值3所在位置) >  第

KJ.JK 1075

华为OD机试真题 - 约瑟夫问题 牛客网

2024华为OD机试真题,代码包含语言java、js、python、c 代码基本都有详细注释。 2024华为OD机试真题 - 约瑟夫问题 (D卷,100分) 题目描述 输入一个由随机数组成的数列(数列中每个数均是大于 0 的整数,长度已知),和初始计数值 m。 从数列首位置开始计数,计数到 m 后,将数列该位置数值替换计数值 m, 并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。 如果计数到达数列尾段,则返回数列首位置继续计数。 请编程实现上述计数过程,同时输出数值出列

2301_76543445的博客 319

华为OD机试 - 报数问题 - 约瑟夫环(Java 2025 C卷 100分)

在这个问题中,n 个人站成一圈,每个人按照顺序报数,报到 3 的人退出圈子,直到只剩下一个人为止。要解决这个问题,我们可以使用数组或链表模拟这个过程,也可以使用数学方法直接找到最后剩下的人的位置。每次移除一个人,最多需要花费 O(n) 的时间,因为在最坏情况下需要遍历整个列表(比如在使用数组或链表时需要寻找并移除第 k 个元素)。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。报数序号为1的人最终报3,因此序号1的人退出圈子,最后剩下序号为2的那位。

学Java,找哪吒 1188

约瑟夫问题 设有N个人围坐一圈,现从某人开始报数, 数到M的人出列,接着从出列的下一个人重新报数,数到M的人又出列,如此下去直到所有人都出列为止,试给出他们的出列次序

Josehus问题算法 设有N个人围坐一圈,现从某人开始报数, 数到M的人出列,接着从出列的下一个人重新报数,数到M的人又出列,如此下去直到所有人都出列为止,给出他们的出列次序。

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

这个问题可以通过模拟计数过程来解决。我们使用一个列表来存储数组元素,并在每次计数到m时删除相应的元素。通过循环和取模操作,我们可以确保计数在数组范围内循环进行。

蓝墨の学习笔记 298

实测有效防止colab自动断开连接

实测有效防止colab自动断开连接

Thebest_jack的博客 1万+
上一篇: 华为机试 - 统计出现最多次数的数字
下一篇: 华为机试 - 求字符串中最大最小值
JerkWisdom
博客等级 码龄14年 70粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值