问题 A: 约瑟夫问题(普及第一关模拟)

题目描述

求解约瑟夫(Joseph)问题。有n个小孩围成一圈,给他们从1开始依次编号,从编号为1的小孩开始报数,数到第m个小孩出列,然后从出列的下一个小孩重新开始报数,数到第m个小孩又出列,…,如此反复直到所有的小孩全部出列为止,求整个出列序列。

如当n=6,m=5时的出列序列是5,4,6,2,3,1。n,m不大于20

输入

n m的值

输出

出列序列

样例输入

6 5

样例输出

5 4 6 2 3 1

问题解析

我们可以看到这个约瑟夫问题(即小孩报数)的问题,其实就是链表问题。我们通过这道题需要掌握的是循环单链表的写法(以c语言为例)

一、循环链表的写法

1.先定义链表的结构体

struct child{int data;struct child* next;
};

然后再全局变量定 “头节点”和“约瑟夫环的两个参数”

struct child* headnode;
int n,m;

下面,我们来定义两个函数,分别是“创建空节点”与“创建有数据的节点”

struct child* emptynode(){struct child* p = (struct child*)malloc(sizeof(struct child));p->data = NULL;p->next = NULL;return p;
}struct child* createnode(int num){struct child* p = (struct child*)malloc(sizeof(struct child));p->data = num;p->next = NULL;return p;
}

我们可以看出这两段代码的主要差别,其实就是p->data=NULL和p->data=num

接下来定义一个函数“createlistBytail”,以尾接法,创建循环单链表

void createlistBytail(struct child* headnode,int num){struct child* r=headnode;for (int i=2; i<=num; i++ ){struct child* s = createnode(i);s->next = r->next;r->next = s;r=s;} r->next = headnode;
}

那么其中需要注意的是,这段代码看似为单纯的创建单链表,其实我们在结尾处添加了一段代码

r->next = headnode;

这段代码保证了单链表的循环,也正因为这段代码,使得我们的单链表成功升级为循环单链表!

当然,为了检验我们的链表是否创建成功,我们可以写入这列代码,来遍历出链表的数据

void printlist(struct child* headnode){struct child* pMove = headnode;while(pMove) {printf("%d",pMove->data );pMove = pMove->next ;}
}

 接下来,我们开始创建solve函数,实现小孩的报数功能

void solve(struct child* headnode,int n,int m){int i,j;struct child* p;struct child* q;for(i=1;i<=n;i++){p = headnode;j = 1;for(j=1;j<m-1;j++){p = p->next ;}q = p->next ;printf("%d ",q->data );p->next = q->next ;headnode = p->next ;}
}

其中,我们需要注意的是 我们在进行第二个for循环时,j<m-1这个数值不要搞错。我们为什么要j<m-1呢?因为我们要保证p是在第m个人的前一个人,这样我们就可以使q指向p->next,也就是我们想要的那个第m个人,实现精准查找,然后精准“删除”。但是问题来了,我们为什么不直接将p指向第m个人呢,这样我们直接输出p不就好了么:(。非也非也!你只是想到了输出数值的事,但是后面的事你却没能想到。

我们在这段函数的主要任务是什么呢?1.输出第m个人2.删除m,让m前一个人接上m后一个人3.将领头人headnode变成m的下一个人,也就是说从m的下一个人开始报数。这样我们不难发现我们将p设为m的前一个人,是要将p-next指向q->next,实现删除m的目的,因为我们节点的指针能指向某节点的后面,却指向不了节点的前面,所以哦我们需要这样的一个p指向m前一个点。

最后,我们编写主函数,将上面的函数包装进去

其中我们要注意的是,创建空节点与数据节点不在主函数里。

int main(){struct child* headnode = createnode(1);scanf("%d %d",&n,&m);createlistBytail(headnode,n);//printlist(headnode);solve(headnode,n,m);return 0;
}

这样,我们的代码就算结束了。最后,给大家奉上“小孩报数”(即约瑟夫问题)的完整版代码

#include<stdio.h>
#include<stdlib.h>
struct child{int data;struct child* next;
};struct child* headnode;
int n,m;struct child* emptynode(){struct child* p = (struct child*)malloc(sizeof(struct child));p->data = NULL;p->next = NULL;return p;
}struct child* createnode(int num){struct child* p = (struct child*)malloc(sizeof(struct child));p->data = num;p->next = NULL;return p;
}void createlistBytail(struct child* headnode,int num){struct child* r=headnode;for (int i=2; i<=num; i++ ){struct child* s = createnode(i);s->next = r->next;r->next = s;r=s;} r->next = headnode;
}void printlist(struct child* headnode){struct child* pMove = headnode;while(pMove) {printf("%d",pMove->data );pMove = pMove->next ;}
}void solve(struct child* headnode,int n,int m){int i,j;struct child* p;struct child* q;for(i=1;i<=n;i++){p = headnode;j = 1;for(j=1;j<m-1;j++){p = p->next ;}q = p->next ;printf("%d ",q->data );p->next = q->next ;headnode = p->next ;}
}int main(){struct child* headnode = createnode(1);scanf("%d %d",&n,&m);createlistBytail(headnode,n);//printlist(headnode);solve(headnode,n,m);return 0;
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云南河道 kml文件_处理能力提升 4 倍 ,大疆智图 4 天完成 5 公里河道建模

马陵河是江苏省宿迁市老城区一条重要排涝河道&#xff0c;1974 年人工开挖而成&#xff0c;全长 5.2 km&#xff0c;汇水面积 11.6 km&#xff0c;居住人口 13.85 万人。河道水质长期处于黑臭状态&#xff0c;严重影响周边居民日常生活&#xff0c;被称为宿迁的“龙须沟”。宿迁…

linq 查询的结果会开辟新的内存吗?

一&#xff1a;背景 1. 讲故事昨天群里有位朋友问&#xff1a;linq 查询的结果会开辟新的内存吗&#xff1f;如果开了&#xff0c;那是对原序列集里面元素的深拷贝还是仅仅拷贝其引用&#xff1f;其实这个问题我觉得问的挺好&#xff0c;很多初学 C# 的朋友或多或少都有这样的疑…

问题 B: 十进制到二进制的转换

这个问题我们来用栈来实现 首先&#xff0c;我们先定义一个栈的结构体&#xff08;栈的结构体与链表的结构体不可同&#xff0c;栈的结构体第二项是用int定义栈的顶端; 而链表的第二项&#xff0c;是用struct定义一个指针&#xff09; struct stack{int data[10005];int top;…

javascript内存泄漏调试工具mac_node.js 内存泄漏的秘密

一直以来&#xff0c;跟踪 Node.js 的内存泄漏是一个反复出现的话题&#xff0c;人们始终希望对其复杂性和原因了解更多。并非所有的内存泄漏都显而易见。但是&#xff0c;一旦我们确定了其模式&#xff0c;就必须在内存使用率&#xff0c;内存中保存的对象和响应时间之间寻找关…

c++STL中的find()函数 有两种使用方法

cSTL中的find()函数 有两种使用方法 方法一&#xff1a; 开头引头文件&#xff1a;中的函数 其调用形式为 find&#xff08;start,end,value&#xff09; start搜寻的起点&#xff0c;end搜寻的终点&#xff0c;要寻找的value值; 如果没有找到&#xff0c;则返回end。函数的返…

关于C# Span的一些实践

Span这个东西出来很久了&#xff0c;居然因为5.0又火起来了。特别感谢RC兄弟提出这个话题。相关知识在大多数情况下&#xff0c;C#开发时&#xff0c;我们只使用托管内存。而实际上&#xff0c;C#为我们提供了三种类型的内存&#xff1a;堆栈内存 - 最快速的内存&#xff0c;能…

问题 C: 【例2-3】围圈报数

题目描述 有&#xff4e;(n<100)个人依次围成一圈&#xff0c;从第&#xff11;个人开始报数&#xff0c;数到第&#xff4d;个人出列&#xff0c;然后从出列的下一个人开始报数&#xff0c;数到第&#xff4d;个人又出列&#xff0c;…&#xff0c;如此反复到所有的人全部…

怎样用python批量处理文件夹_python批量处理文件或文件夹

本文实例为大家分享了python批量处理文件或文件夹的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 # -*- coding: utf-8 -*- import os,shutil import sys import numpy as np ##########批量删除不同文件夹下的同名文件夹############# def arrange_file(dir_path0…

leetcode-349-两个数组的交集

给定两个数组&#xff0c;编写一个函数来计算它们的交集。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2] 示例 2&#xff1a; 输入&#xff1a;nums1 [4,9,5], nums2 [9,4,9,8,4] 输出&#xff1a;[9,4] 说明&#xff1a; 输…

Leansoft再发招贤令:面试官徐磊有话讲 | IDCF

&#xff08;图片来源于网络&#xff09;2020是Leansoft成立的第五年&#xff0c;凭借专业的服务及实施能力&#xff0c;逐渐成长为国内唯一的端到端专业DevOps实施服务公司。Leansoft是一家怎样的公司呢&#xff1f;准确地说&#xff0c;我们其实是国内唯一一家提供端到端的De…

问题 B: 数塔问题

题目描述 有如下所示的数塔&#xff0c;要求从顶层走到底层&#xff0c;若每一步只能走到相邻的结点&#xff0c;则经过的结点的数字之和最大是多少&#xff1f; 输入 第一行是一个整数N(1 < N < 20)&#xff0c;表示数塔的高度&#xff0c;接下来用N个数字表示数塔&a…

leetcode-345-翻转字符串中的元音字母

编写一个函数&#xff0c;以字符串作为输入&#xff0c;反转该字符串中的元音字母。 示例 1&#xff1a; 输入&#xff1a;“hello” 输出&#xff1a;“holle” 示例 2&#xff1a; 输入&#xff1a;“leetcode” 输出&#xff1a;“leotcede” 来源&#xff1a;力扣&…

e盾服务端源码_gRPC服务注册发现及负载均衡的实现方案与源码解析

今天聊一下gRPC的服务发现和负载均衡原理相关的话题&#xff0c;不同于Nginx、Lvs或者F5这些服务端的负载均衡策略&#xff0c;gRPC采用的是客户端实现的负载均衡。什么意思呢&#xff0c;对于使用服务端负载均衡的系统&#xff0c;客户端会首先访问负载均衡的域名/IP&#xff…

堆问题(最小堆变最大堆,堆删除,中序遍历)

2-6 设最小堆&#xff08;小根堆&#xff09;的层序遍历结果为 {8, 38, 25, 58, 52, 82, 70, 60}。用线性时间复杂度的算法将该堆调整为最大堆&#xff08;大根堆&#xff09;&#xff0c;然后连续执行两次删除最大元素操作&#xff08;DeleteMax&#xff09;。则该树的中序遍历…

推荐一款.NET Core开源爬虫神器:DotnetSpider

没有爬虫就没有互联网&#xff01;爬虫的意义在于采集大批量数据&#xff0c;然后基于此进行加工/分析&#xff0c;做更有意义的事情。谷歌&#xff0c;百度&#xff0c;今日头条&#xff0c;天眼查都离不开爬虫。去开源中国和Github查询C#的爬虫项目&#xff0c;仅有几个非常简…

Excel学习使用教程

1.Excel的保存与加密 加密&#xff1a; 我设置的密码&#xff1a;517485

python数据导入hive_Python操作HIve,将数据插入到Mysql

Python操作HIve&#xff0c;将数据插入到Mysql import sys from hive_service import ThriftHive from hive_service.ttypes import HiveServerException from thrift import Thrift from thrift.transport import TSocket from thrift.transport import TTransport from thrif…

问题 D: 二叉树求高度

题目描述 已知一棵二叉树用邻接表结构存储&#xff0c;求这棵树的高度。例&#xff1a;如图二叉树的数据文件的数据格式如下: 输入 第一行n为二叉树的结点个树&#xff0c;n≤100&#xff1b;以下第一列数据是各结点的值&#xff0c;第二列数据是左儿子结点编号&#xff0c;第…

.Net Core in Docker - 使用阿里云Codepipeline及阿里云容器镜像服务实现持续集成(CI)...

前面已经介绍过了 .Net Core In Docker 在容器内编译并发布的内容。但是每次通过 SSH 链接到服务器敲命令&#xff0c;运行脚本也是挺麻烦的一件事。程序员是最懒的&#xff0c;能让电脑解决的问题绝不手动解决&#xff0c;如果当我们push一次代码后自动build代码&#xff0c;自…

leetcode-445. 两数相加 II

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数字都不会以零开头。 进阶&#xff1a; 如果输入链表不能修改该如何处理&#xff1f;换…