2026/3/22 19:05:17
网站建设
项目流程
网站合同需要注意什么呢,谷歌是如何运营的,网站网页翻页设计,如何创建一个论坛(新卷,100分)- 约瑟夫问题#xff08;Java JS Python C#xff09;题目描述输入一个由随机数组成的数列#xff08;数列中每个数均是大于 0 的整数#xff0c;长度已知#xff09;#xff0c;和初始计数值 m。从数列首位置开始计数#xff0c;计数到 …(新卷,100分)- 约瑟夫问题Java JS Python C题目描述输入一个由随机数组成的数列数列中每个数均是大于 0 的整数长度已知和初始计数值 m。从数列首位置开始计数计数到 m 后将数列该位置数值替换计数值 m并将数列该位置数值出列然后从下一位置从新开始计数直到数列所有数值出列为止。如果计数到达数列尾段则返回数列首位置继续计数。请编程实现上述计数过程同时输出数值出列的顺序。比如输入的随机数列为3,1,2,4初始计数值 m7从数列首位置开始计数数值 3 所在位置第一轮计数出列数字为 2计数值更新 m2出列后数列为 3,1,4从数值 4 所在位置从新开始计数第二轮计数出列数字为 3计数值更新 m3出列后数列为 1,4从数值 1 所在位置开始计数第三轮计数出列数字为 1计数值更新 m1出列后数列为 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[]输出的数值出列顺序用例输入3,1,2,447输出2,3,1,4说明输入第一行是初始数列intput_array第二行是初始数列的长度len第三行是初始计数值m输出数值出列顺序题目解析本题就是约瑟夫环的变种题。约瑟夫环的解题有多种方式比较容易理解和实现的可以使用双端队列。即intput_array当成双端队列从队头取出元素判断此时计数是否为m若是则将取出的元素加入output_arr并将取出的元素的值赋值给m然后len--计数重置为1若不是则将取出的元素塞回intput_array的队尾仅计数但是本题JS是基于数组实现的双端队列因此每次头部元素出队都意味着一次O(n)复杂度的数组元素前移一位操作这是非常影响性能的。对于JavaPython都有内置的双端队列结构因此可以直接复用对于C可以自己实现双端队列结构。因此JS语言我们可以选择循环链表来模拟约瑟夫环。循环链表本身就实现了环形结构其head.prev tailtail.next head。且循环链表删除节点的复杂度是O(1)。唯一的遗憾是JS没有原生的循环链表结构我们需要自己实现。但是我们只需要实现最简单的循环链表即可即只实现循环链表的尾部新增节点操作即可。而删除操作可以在实际业务中完成。JavaScript算法源码双端队列/* JavaScript Node ACM模式 控制台输入获取 */ const readline require(readline); const rl readline.createInterface({ input: process.stdin, output: process.stdout, }); const lines []; rl.on(line, (line) { lines.push(line); if (lines.length 3) { const input_arr lines[0].split(,); const len lines[1]; const m lines[2]; const output_arr []; array_iterate(len, input_arr, m, output_arr); console.log(output_arr.join(,)); lines.length 0; } }); function array_iterate(len, input_arr, m, output_arr) { let i 1; while (len 0) { const out input_arr.shift(); if (i m) { output_arr.push(out); m out; i 1; len--; } else { input_arr.push(out); i; } } }循环链表/* JavaScript Node ACM模式 控制台输入获取 */ const readline require(readline); const rl readline.createInterface({ input: process.stdin, output: process.stdout, }); const lines []; rl.on(line, (line) { lines.push(line); if (lines.length 3) { const input_arr lines[0].split(,); const len lines[1]; const m lines[2]; const output_arr []; array_iterate(len, input_arr, m, output_arr); console.log(output_arr.join(,)); lines.length 0; } }); function array_iterate(len, input_arr, m, output_arr) { const cll new CircularLinkedList(); cll.init(input_arr); let cur cll.head; let i 1; while (cll.size) { if (i m) { const pre cur.prev; const nxt cur.next; pre.next nxt; nxt.prev pre; m cur.val; output_arr.push(m); cur.next cur.prev null; cur nxt; i 1; cll.size--; } else { i; cur cur.next; } } } class Node { constructor(val) { this.val val; this.next null; this.prev null; } } class CircularLinkedList { constructor() { this.head null; this.tail null; this.size 0; } append(val) { const node new Node(val); if (this.size) { this.tail.next node; node.prev this.tail; this.tail node; } else { this.head node; this.tail node; } this.head.prev this.tail; this.tail.next this.head; this.size; } init(arr) { arr.forEach((val) { this.append(val); }); } }Java算法源码Java可以使用LinkedList模拟双端队列import java.util.*; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); Integer[] input_arr Arrays.stream(sc.nextLine().split(,)).map(Integer::parseInt).toArray(Integer[]::new); int len Integer.parseInt(sc.nextLine()); int m Integer.parseInt(sc.nextLine()); System.out.println(getResult(input_arr, len, m)); } public static String getResult(Integer[] input_arr, int len, int m) { LinkedListInteger dq new LinkedList(Arrays.asList(input_arr)); ArrayListInteger output_arr new ArrayList(); int i 1; while (len 0) { Integer out dq.removeFirst(); if (i m) { output_arr.add(out); m out; i 1; len--; } else { dq.add(out); i; } } StringJoiner sj new StringJoiner(,); for (Integer ele : output_arr) { sj.add(ele ); } return sj.toString(); } }Python算法源码from collections import deque # 输入获取 input_arr deque(list(map(int, input().split(,)))) length int(input()) m int(input()) # 算法入口 def getResult(): global input_arr global length global m output_arr [] i 1 while length 0: out input_arr.popleft() if i m: output_arr.append(out) m out i 1 length - 1 else: input_arr.append(out) i 1 return ,.join(map(str, output_arr)) # 算法调用 print(getResult())C算法源码#include stdio.h #include stdlib.h #include string.h typedef struct ListNode { int ele; struct ListNode* next; } ListNode; typedef struct { int size; ListNode* head; ListNode* tail; } LinkedList; LinkedList* new_LinkedList(); void addLast_LinkedList(LinkedList* link, int ele); int removeFirst(LinkedList* link); int main() { LinkedList* dq new_LinkedList(); int num; while(scanf(%d, num)) { addLast_LinkedList(dq,num); if(getchar() ! ,) break; } int len; scanf(%d, len); int m; scanf(%d, m); LinkedList* output_arr new_LinkedList(); int i 1; while(len 0) { int out removeFirst(dq); if(i m) { addLast_LinkedList(output_arr,out); m out; i 1; len--; } else { addLast_LinkedList(dq,out); i; } } char res[100000]; ListNode* cur output_arr-head; while(cur ! NULL) { char tmp[10]; sprintf(tmp, %d, cur-ele); strcat(res, tmp); cur cur-next; if(cur ! NULL) { strcat(res, ,); } } puts(res); return 0; } LinkedList* new_LinkedList() { LinkedList* link (LinkedList*) malloc(sizeof(LinkedList)); link-size 0; link-head NULL; link-tail NULL; return link; } void addLast_LinkedList(LinkedList* link, int ele) { ListNode* node (ListNode*) malloc(sizeof(ListNode)); node-ele ele; node-next NULL; if(link-size 0) { link-head node; link-tail node; } else { link-tail-next node; link-tail node; } link-size; } int removeFirst(LinkedList* link) { if(link-size 0) exit(-1); ListNode* removed link-head; if(link-size 1) { link-head NULL; link-tail NULL; } else { link-head link-head-next; } link-size--; int res removed-ele; free(removed); return res; }